Java集合類架構的最佳實踐有哪些?
參考答案
根據應用的需要正确選擇要使用的集合的類型對性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我們就應該用Array而不是ArrayList。
有些集合類允許指定初始容量。是以,如果我們能估計出存儲的元素的數目,我們可以設定初始容量來避免重新計算hash值或者是擴容。
為了類型安全,可讀性和健壯性的原因總是要使用泛型。同時,使用泛型還可以避免運作時的ClassCastException。
使用JDK提供的不變類(immutable class)作為Map的鍵可以避免為我們自己的類實作hashCode()和equals()方法。
程式設計的時候接口優于實作。
底層的集合實際上是空的情況下,傳回長度是0的集合或者是數組,不要傳回null。
Enumeration接口和Iterator接口的差別有哪些?
參考答案
Enumeration速度是Iterator的2倍,同時占用更少的記憶體。但是,Iterator遠遠比Enumeration安全,因為其他線程不能夠修改正在被iterator周遊的集合裡面的對象。同時,Iterator允許調用者删除底層集合裡面的元素,這對Enumeration來說是不可能的。
HashSet和TreeSet有什麼差別?
參考答案
HashSet是由一個hash表來實作的,是以,它的元素是無序的。add(),remove(),contains()方法的時間複雜度是O(1)。
另一方面,TreeSet是由一個樹形的結構來實作的,它裡面的元素是有序的。是以,add(),remove(),contains()方法的時間複雜度是O(logn)。
Java中垃圾回收有什麼目的?什麼時候進行垃圾回收?
參考答案
垃圾回收的目的是識别并且丢棄應用不再使用的對象來釋放和重用資源。
System.gc()和Runtime.gc()會做什麼事情?
參考答案
這兩個方法用來提示JVM要進行垃圾回收。但是,立即開始還是延遲進行垃圾回收是取決于JVM的。
finalize()方法什麼時候被調用?析構函數(finalization)的目的是什麼?
參考答案
垃圾回收器(garbage colector)決定回收某對象時,就會運作該對象的finalize()方法 但是在Java中很不幸,如果記憶體總是充足的,那麼垃圾回收可能永遠不會進行,也就是說filalize()可能永遠不被執行,顯然指望它做收尾工作是靠不住的。 那麼finalize()究竟是做什麼的呢?它最主要的用途是回收特殊管道申請的記憶體。Java程式有垃圾回收器,是以一般情況下記憶體問題不用程式員操心。但有一種JNI(Java Native Interface)調用non-Java程式(C或C++),finalize()的工作就是回收這部分的記憶體。
如果對象的引用被置為null,垃圾收集器是否會立即釋放對象占用的記憶體?
參考答案
不會,在下一個垃圾回收周期中,這個對象将是可被回收的。
Java堆的結構是什麼樣子的?什麼是堆中的永久代(Perm Gen space)?
參考答案
JVM的堆是運作時資料區,所有類的執行個體和數組都是在堆上配置設定記憶體。它在JVM啟動的時候被建立。對象所占的堆記憶體是由自動記憶體管理系統也就是垃圾收集器回收。
堆記憶體是由存活和死亡的對象組成的。存活的對象是應用可以通路的,不會被垃圾回收。死亡的對象是應用不可通路尚且還沒有被垃圾收集器回收掉的對象。一直到垃圾收集器把這些對象回收掉之前,他們會一直占據堆記憶體空間。
串行(serial)收集器和吞吐量(throughput)收集器的差別是什麼?
參考答案
吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等規模和大規模資料的應用程式。而串行收集器對大多數的小應用(在現代處理器上需要大概100M左右的記憶體)就足夠了。
在Java中,對象什麼時候可以被垃圾回收?
參考答案
當對象對目前使用這個對象的應用程式變得不可觸及的時候,這個對象就可以被回收了。
JVM的永久代中會發生垃圾回收麼?
參考答案
垃圾回收不會發生在永久代,如果永久代滿了或者是超過了臨界值,會觸發完全垃圾回收(Full GC)。如果你仔細檢視垃圾收集器的輸出資訊,就會發現永久代也是被回收的。這就是為什麼正确的永久代大小對避免Full GC是非常重要的原因。請參考下Java8:從永久代到中繼資料區
(注:Java8中已經移除了永久代,新加了一個叫做中繼資料區的native記憶體區)
Java中的兩種異常類型是什麼?他們有什麼差別?
參考答案
Java中有兩種異常:受檢查的(checked)異常和不受檢查的(unchecked)異常。不受檢查的異常不需要在方法或者是構造函數上聲明,就算方法或者是構造函數的執行可能會抛出這樣的異常,并且不受檢查的異常可以傳播到方法或者是構造函數的外面。相反,受檢查的異常必須要用throws語句在方法或者是構造函數上聲明。這裡有Java異常處理的一些小建議。
Java中Exception和Error有什麼差別?
參考答案
Exception和Error都是Throwable的子類。Exception用于使用者程式可以捕獲的異常情況。Error定義了不期望被使用者程式捕獲的異常。
throw和throws有什麼差別?
參考答案
throw關鍵字用來在程式中明确的抛出異常,相反,throws語句用來表明方法不能處理的異常。每一個方法都必須要指定哪些異常不能處理,是以方法的調用者才能夠確定處理可能發生的異常,多個異常是用逗号分隔的。