Java常見問題總結

一、Object有哪些公共方法?html

答:clone(),equals(),hashCode(),wait(), getClass(),finalize(),notify(),notifyAll(),toString()java

二、Object中finalize()的做用?數組

答:用於清理。finalize()方法不須要顯示地調用, 在垃圾回收(GC)時會被自動先行調用的。安全

三、Java中四種引用方式?jsp

答:http://my.oschina.net/eager/blog/726428性能

四、hashCode()的做用?ui

答:hashcode是jdk根據對象的地址或者字符串或者數字算出來的int類型的數值。spa

        在 Java 應用程序執行期間,在對同一對象屢次調用 hashCode()時,必須一致地返回相同的整數,前提是將對象進行hashCode()比較時所用的信息沒有被修改。.net

  • 若是兩個對象根據hashCode()返回的整數值不等,則equals()獲得的結果一定爲false;
  • 若是兩個對象根據equals()比較是相等的,那麼調用兩個對象的hashCode()必須返回相同的整數結果;
  • 若是兩個對象根據equals()比較是不等的,則hashCode()不必定得返回不一樣的整數。

詳見:http://www.cnblogs.com/dolphin0520/p/3681042.html線程

五、ArrayList、LinkedList、Vector的區別?

線程安全性:

  • Vector、Stack:線程安全
  • ArrayList、LinkedList:非線程安全

實現方式:

  • LinkedList:雙向鏈表
  • ArrayList,Vector,Stack:數組

擴容方式:

Stack繼承自Vector,故不分開解釋。

  • ArrayList擴容原來的50%(int newCapacity = (oldCapacity * 3)/2 + 1)
  • Vector缺省狀況是原來的1倍(newCapacity  = oldCapacity * 2)

 其餘詳見:http://blog.csdn.net/a19881029/article/details/45533733

六、String、StringBuffer與StringBuilder的區別?

  • String類爲final類型
  • StringBuffer線程安全的可變字符序列
  • StringBuilder線程不安全,JDK5.0新增
  • 在構造 StirngBuffer 或 StirngBuilder 時應儘量指定它們的容量。若是操做的字符串長度(length)不超過 16 個字符就不用了,缺省時默認構造一個容量爲16的對象,不然不指定會下降性能

詳見:http://blog.csdn.net/kingzone_2008/article/details/9220691

七、java.io 與 java.nio的區別?

主要區別以下表:

IO NIO
面向流 面向緩衝
阻塞IO 非阻塞IO
選擇器

詳見:http://my.oschina.net/eager/blog/729320

八、HashMap和Hashtable(注意 t 是小寫的)的區別?

  • Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現;
  • Hashtable是線程安全的,HashMap是線程不安全的;
  • HashMap容許null做爲Entry的key和value,Hashtable不容許;
  • Hashtable使用Enumeration,HashMap使用Iterator遍歷;
  • Hashtable中hash數組默認大小是11,擴容的方式是 old*2+1,HashMap中hash數組的默認大小是16,擴容必定是2的指數。

九、HashMap和ConcurrentHashMap的區別?

  • HashMap是since JDK1.2,ConcurrentHashMap是since JDK1.5;
  • HashMap是線程不一樣步的,ConcurrentHashMap是線程同步的;
  • HashMap本質是數組+鏈表,ConcurrentHashMap將數據分爲多個segment,默認16個。

ConcurrentHashMap詳見:http://www.cnblogs.com/dolphin0520/p/3932905.html

ConcurrentHashMap實現同步分析:http://blog.csdn.net/xuefeng0707/article/details/40834595

十、Hashtable和ConcurrentHashMap的區別?

  • Hashtable採起的是synchronized整個方法,ConcurrentHashMap採起的是synchronized代碼塊
  • Hashtable每次同步鎖總體,ConcurrentHashMap只鎖當前須要用到的segment

更多關於Map的詳見:http://my.oschina.net/eager/blog/729795

十一、try{}裏有一個return語句,finally{}裏的代碼還會執行嗎?

會執行,在return以前執行。

public class Test {
	public static void main(String[] args) {
		int a = 1;
		System.out.println("a:"+a);
		System.out.println("result:"+getNum(a));
	}

	public static int getNum(int a) {
		try {
			a = 2;
			System.out.println("try-a:"+a);
			return a;
		} finally {
			a = 3;
			System.out.println("finally-a:"+a);
		}
	}
}

結果展現:

可能會以爲很疑惑,從輸出能夠看出是執行了finally中的語句,但爲何最終返回值是2。由於若是存在finally代碼塊,try中的return語句不會立馬返回調用者,而是記錄下返回值待finally代碼塊執行完畢以後再向調用者返回其值,因此在finally塊中調用return,則會修改返回值,可是不建議這樣作。

十二、Excption與Error包結構?

1三、OOM你遇到過哪些狀況?SOF你遇到過哪些狀況?

OOM(Out Of Memory):當JVM由於沒有足夠的內存來爲對象分配空間而且垃圾回收器也已經沒有空間可回收時,就會拋出這個Error(注:非Exception,由於這個問題已經嚴重到不足以被應用處理)。

  • 1)分配的少了,好比虛擬機自己可以使用的內存(通常經過啓動時的JVM參數指定)太少。
  • 2)應用用的太多,而且用完沒釋放,浪費了,此時就會形成內存泄露或者內存溢出。
    • 內存泄露:申請使用完的內存沒有釋放,致使虛擬機不能再次使用該內存,此時這段內存就泄露了,由於申請者不用了,而又不能被虛擬機分配給別人用。
    • 內存溢出:申請的內存超出了JVM能提供的內存大小,此時稱之爲溢出。

常見內存溢出狀況:

  • java.lang.OutOfMemoryError: Java heap space ------>java堆內存溢出,此種狀況最多見,通常因爲內存泄露或者堆的大小設置不當引發。對於內存泄露,須要經過內存監控軟件查找程序中的泄露代碼,而堆大小能夠經過虛擬機參數-Xms,-Xmx等修改。
  • java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出,即方法區溢出了,通常出現於大量Class或者jsp頁面,或者採用cglib等反射機制的狀況,由於上述狀況會產生大量的Class信息存儲於方法區。此種狀況能夠經過更改方法區的大小來解決,使用相似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,過多的常量尤爲是字符串也會致使方法區溢出

SOF(Stack Over Flow):JAVA虛擬機棧溢出,通常是因爲程序中存在死循環或者深度遞歸調用形成的,棧大小設置過小也會出現此種溢出。能夠經過虛擬機參數-Xss來設置棧的大小。

詳見:http://www.cnblogs.com/gaojing/archive/2012/10/30/2844938.html

 

未完待續,該博客會每一天進行更新。

相關文章
相關標籤/搜索