Java程式設計師集合框架面試題

才智咖 人氣:1.78W

Java集合框架是最常被問到的Java面試問題,要理解 Java技術強大特性就有必要掌握集合框架。這裡有一些實用問題,常在核心 Java 面試中問到。

Java程式設計師集合框架面試題

1、什麼是 Java 集合 API

Java 集合框架 API 是用來表示和操作集合的統一框架,它包含介面、實現類、以及幫助程式設計師完成一些程式設計的演算法。簡言之,API 在上層完成以下幾件事:

程式設計更加省力,提高城程式速度和程式碼質量

非關聯的 API 提高互操作性

節省學習使用新 API 成本

節省設計新 API 的時間

鼓勵、促進軟體重用

具體來說,有 6 個集合介面,最基本的是 Collection 介面,由三個介面 Set、List、SortedSet 繼承,另外兩個介面是 Map、SortedMap,這兩個介面不繼承 Collection,表示對映而不是真正的集合。

2、什麼是 Iterator

一些集合類提供了內容遍歷的功能,通過 ator 介面。這些介面允許遍歷物件的集合。依次操作每個元素物件。當使用 Iterators 時,在獲得 Iterator 的時候包含一個集合快照。通常在遍歷一個Iterator 的時候不建議修改集合本省。

3、 Iterator 與 ListIterator 有什麼區別?

Iterator:只能正向遍歷集合,適用於獲取移除元素。ListIerator:繼承 Iterator,可以雙向列表的遍歷,同樣支援元素的修改。

4、什麼是 HaspMap 和 Map?

Map 是介面,Java 集合框架中一部分,用於儲存鍵值對,HashMap 是用雜湊演算法實現 Map 的類。

5、 HashMap 與 HashTable 有什麼區別?對比 Hashtable VS HashMap

兩者都是用 key-value 方式獲取資料。Hashtable 是原始集合類之一(也稱作遺留類)。HashMap 作為新集合框架的一部分在 Java2 的1.2版本中加入。它們之間有一下區別:

HashMap 和 Hashtable 大致是等同的,除了非同步和空值(HashMap 允許 null 值作為 key 和 value,而 Hashtable 不可以)。

HashMap 沒法保證對映的順序一直不變,但是作為 HashMap 的子類 LinkedHashMap,如果想要預知的順序迭代(預設按照插入順序),你可以很輕易的置換為 HashMap,如果使用 Hashtable 就沒那麼容易了。

HashMap 不是同步的,而 Hashtable 是同步的'。

迭代 HashMap 採用快速失敗機制,而 Hashtable 不是,所以這是設計的考慮點。

6、在 Hashtable 上下文中同步是什麼意思?

同步意味著在一個時間點只能有一個執行緒可以修改雜湊表,任何執行緒在執行hashtable 的更新操作前需要獲取物件鎖,其他執行緒等待鎖的釋放。

7、什麼叫做快速失敗特性

從高級別層次來說快速失敗是一個系統或軟體對於其故障做出的響應。一個快速失敗系統設計用來即時報告可能會導致失敗的任何故障情況,它通常用來停止正常的操作而不是嘗試繼續做可能有缺陷的工作。當有問題發生時,快速失敗系統即時可見地發錯錯誤告警。在 Java 中,快速失敗與 iterators 有關。如果一個 iterator 在集合物件上建立了,其它執行緒欲“結構化”的修改該集合物件,併發修改異常 (ConcurrentModificationException) 丟擲。

8、怎樣使 Hashmap 同步?

HashMap 可以通過 Map m = hronizedMap(hashMap)來達到同步的效果。

9、什麼時候使用 Hashtable,什麼時候使用 HashMap

基本的不同點是 Hashtable 同步 HashMap 不是的,所以無論什麼時候有多個執行緒訪問相同例項的可能時,就應該使用 Hashtable,反之使用 HashMap。非執行緒安全的資料結構能帶來更好的效能。

如果在將來有一種可能—你需要按順序獲得鍵值對的方案時,HashMap 是一個很好的選擇,因為有 HashMap 的一個子類 LinkedHashMap。所以如果你想可預測的按順序迭代(預設按插入的順序),你可以很方便用 LinkedHashMap 替換 HashMap。反觀要是使用的 Hashtable 就沒那麼簡單了。同時如果有多個執行緒訪問 HashMap,hronizedMap ()可以代替,總的來說HashMap 更靈活。

10、為什麼 Vector 類認為是廢棄的或者是非官方地不推薦使用?或者說為什麼我們應該一直使用 ArrayList 而不是 Vector

你應該使用 ArrayList 而不是 Vector 是因為預設情況下你是非同步訪問的,Vector 同步了每個方法,你幾乎從不要那樣做,通常有想要同步的是整個操作序列。同步單個的操作也不安全(如果你迭代一個 Vector,你還是要加鎖,以避免其它執行緒在同一時刻改變集合).而且效率更慢。當然同樣有鎖的開銷即使你不需要,這是個很糟糕的方法在預設情況下同步訪問。你可以一直使用 ronizedList 來裝飾一個集合。

事實上 Vector 結合了“可變陣列”的集合和同步每個操作的實現。這是另外一個設計上的缺陷。Vector 還有些遺留的方法在列舉和元素獲取的方法,這些方法不同於 List 介面,如果這些方法在程式碼中程式設計師更趨向於想用它。儘管列舉速度更快,但是他們不能檢查如果集合在迭代的時候修改了,這樣將導致問題。儘管以上諸多原因,oracle 也從沒宣稱過要廢棄 Vector.