架構師面試指導性框架(面試官給出的超級標准答案):
一、Java基礎
1.java基類是什麼?有哪些方法?
答:java.lang.Object; 對象相關{getClass()、protected clone()、toString()、equals()、hashCode()、private registerNatives()}、線程相關{notify()、notifyAll()、wait(空|long|long,int)}、GC相關的{finalize()}。
2.equals和==差別?
答:equals為對象相等;==代表引用相等(即同一個對象)。Object.equals()的實現和==相同,但子類可以覆蓋此方法,以便實現不同的比較算法,例如String.equals()逐字比較。
3.hashCode()的作用?
答:在HashMap和HashSet中,做為雜湊值,來提高查找性能。Object.hashCode()實際上返回的是對象的引用地址,但子類可以覆蓋此方法,實現不同的雜湊算法。
4.hashCode()方法和equals()方法的關系
答:如果兩個對象equals()相等,那麼hashCode()必須相等;反之,則不一定。hashCode()相等,可能equals()不等,但這個概率不能太高,否則將增加HashMap沖突的可能性,而降低查找的效率。
5.如何停止一個線程?
答:設置一個標記,讓線程自動停止。必要時,主線程執行join方法,等待子線程完全退出。
public class TestThread { private boolean exit = false; private void go() throws Exception { Thread thread = new Thread(new MyRunnable(), "my_thread"); System.out.println("Press Enter to exit..."); thread.start(); /* System.in返回InputStream; read()返回一個int值 */ System.in.read(); exit = true; thread.join(); } private class MyRunnable implements Runnable { @Override public void run() { for (int i = 1; !exit; i++) { System.out.println(Thread.currentThread().getName() + ": " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { } } } } public static void main(String[] args) throws Exception { new TestThread().go(); } }
事實上,Thread自己有interrupted標志,可以通過Thread.interrupted()或某些方法的InterruptedException來捕獲中斷標志。
6.Thread.setDeamon()的含義?
答:一個Daemon線程是一個在背景執行服務的線程,例如網絡服務器傾聽連接端口的服務、隱藏的系統線程如垃圾收集線程或其它JVM 建立的線程,如果所有的非Daemon的線程都結束了,則Daemon線程自動就會終止。Thread.setDaemon(true)就是設置一個線程為daemon線程。該方法必須在Thread.start()之前執行。並且daemon線程創建的子線程,自動成為daemon線程。
7.classLoader的功能和工作模式?
答:ClassLoader的功能是讀取二進制碼,生成Class對象。ClassLoader使用的是委托模式(delegation模式)。ClassLoader呈樹狀結構,每個結點代表一個ClassLoader。一般來說,ClassLoader查找一個類時,會先詢問parent ClassLoader,如果找不到,才會在自身查找。下面是JavaEE ClassLoader的常見結構:(System Class Loader之前其實省略了一個Bootstrap Class Loader,用來裝載jre/lib下的JDK基本類)
8.列舉幾個Collection類庫中常用的類,並簡述其結構。
答:Set{HashSet、TreeSet}、List{ArrayList、LinkedList、Vector}、Map{HashMap、HashTable、TreeMap}
9.InputStream、OutputStream和Reader、Writer有何區別?何為字符?何為字節?
10.如何在字符流和字節流之間轉換?
11.GC垃圾收集是什麼意思?怎麼樣的對象會被垃圾收集?
二、J2EE基礎
1.JSP工作原理
答:JSP會先轉換成Servlet,然後再執行。
2.Servlet中session工作原理
答:通過JessionId來索引session數據。通常將JessionId保存在cookie中,但也可以編碼到URL中。session的數據是保存在服務端的,具體的實現方式由應用服務器決定。
3.WEB層是如何解決Cluster的?
答:關鍵是解決session的問題,可以通過sticky server的方式,也可以通過session復制的機制。如果web應用不使用session(無狀態的),則可以將請求隨機分發到任何一台對等的應用服務器上。
4.JMS模式?
答:Queue模式:point-to-point(點對點),一頭發消息,一頭收消息。消息收掉就沒了,兩個接收者不能收到同一個消息。Topic模式:publish-subscriber(發布、訂閱),一個人發消息,多個訂閱topic的人接收消息,多個接收者能夠收到同一個topic中的同一個消息。
5.Transcation有哪幾種隔離級別(Isolation level)?
答:數據在修改過程中的中間狀態對其它事務的可見程度,和其它事務修改數據的中間狀態對本事務的可見性。
// 1. READ UNCOMMITTED --Dirty reads, non-repeatable reads, and phantom reads are all allowed; // 2. READ COMMITTED --Dirty reads are prevented; non-repeatable reads and phantom reads are allowed.; // 3. REPEATABLE READ --Dirty reads and non-repeatable reads are prevented; phantom reads are allowed; // 4. SERIALIZABLE --Dirty reads, non-repeatable reads, and phantom reads are all prevented; // Oracle支持兩種:READ COMMITTED(默認)、SERIALIZABLE。
6.Golbal transcation原理是什麼?
答:兩階段可以提交。不僅可對數據庫,也可對其他資源如JMS進行transcation操作。
三、框架相關
1.Spring核心理念是什麼?
答:核心是IoC(Inversion of Control、反轉控制)或DJ(Dependency Injection、依賴注入)。通過IoC或DJ的方式來裝配對象,解除對象與對象之間的耦合性,從而簡化應用的開發、測試過程。和IoC或DJ密切相關的,還有AOP(Aspect Oriented Programming、面向切面的編程)。有了IoC,就很容易實現AOP。通過AOP,可以將額外的功能透明地附著於對象上,而不會影響到使用對象的代碼。通過此種機制,就可實現很多功能:遠程、異步調用、Transaction、Security、Intercepter。
// 3.3.1.Web層框架 // Webwork、Struts、Tapestry、Turbine、Spring MVC…… // 3.3.2.數據層框架 // Hibernate、iBatis、Torque、OJB…… // 3.3.3.普通工具類 // Jakarta commons…… // 模板工具:Velocity、Freemarker…… // 3.3.4.測試框架 // Junit、Testng、Cactus、HttpUnit…… // 3.3.5.Service框架 // Spring、HiveMind、Avalon……
2.mybatis和hibernate的異同點、優缺點
3.OOA(Object-Oriented Analysis 面向對象分析方法)、OOD(Object-Oriented Design,OOD)原則中,類A依賴類B會產生什麼問題?
答:A的擴展性會有問題:如果希望擴展A,使之操作另一個對象C,則必須修改A的代碼。A的穩定性會有問題:對B的修改將會影響到A(可能需要重編譯A)。
4.如何解除這種耦合?
答:使用接口:A依賴接口I,B實現接口I。使用接口和適配器(如果B不能實現接口I):A依賴接口I,適配器B'實現接口I,並且內部依賴B。
5.列舉若干設計模式?並說名其解決的問題?