Java集合類是JDK學習中的一個經典切入點,也是讓初學者最初感受到Java魅力的地方之一,你一定不會忘記不需要關心大小的ArrayList
,不用自己實現的Queue
,和隨處可見的HashMap
。面試中,對Java基礎的考察中,集合類和String相關是兩個重點,這裡集中整理了關於集合類的一些知識點。
集合類的結構
要求手繪結構圖,同時丟擲一些簡單的線索勾引面試官提問(比如講HashMap的HashTable的區別)。
XX和XX的區別
ArrayList & Vector & LinkedList
- 實現方式:
- ArrayList、Vector 基於陣列實現
- LinkedList 基於連結串列實現
- 同步問題:
- ArrayList、LinkedList 不是執行緒安全的
- Vector 是執行緒安全的,實現方式是在方法上加 synchronized 關鍵字進行修飾
- 適用場景和效能消耗:
- ArrayList 和 Vector 基於陣列實現,所以隨機位置增、刪是 O(n) 的時間複雜度,另外可能會出現擴容的問題,也是 O(n) 的時間複雜度
- LinkedList 不會出現擴容的問題,所以比較適合隨機位置增、刪。但是其基於連結串列實現,所以在定位時需要線性掃描,會消耗 O(n) 的時間複雜度
- 擴容:
- ArrayList預設初始容量為10,每次擴容為原來的1.5倍
- Vactor預設初始容量為10,預設每次擴容為原來的2倍(可通過capacityIncrement設定)
HashMap & HashTable
- HashMap是非執行緒安全的,HashTable是執行緒安全的
- 擴容機制相同
HashMap & TreeMap
- HashMap實現了Map介面,不保障元素順序。實現原理balabala
- TreeMap實現了SortedMap介面,是一個有序的Map。內部採用紅黑樹實現,紅黑樹是一種維護有序資料的高效資料結構,但具體演算法沒有掌握
HashMap & LinkedHashMap
- HashMap是無序的;如果希望容器按照自定義順序遍歷可使用TreeMap;如果希望按照插入順序遍歷,可使用LinkedHashMap
- LinkedHashMap是HashMap的一個子類,與HashMap相比,在Entry中增加了before、after兩個引用,利用雙向連結串列維護插入順序
static class Entry<K,V> extends HashMap.Node<K,V> {
Entry<K,V> before, after;
Entry(int hash, K key, V value, Node<K,V> next) {
super(hash, key, value, next);
}
}複製程式碼
HashSet & HashMap
- HashMap實現了Map介面,原理balabala
- HashSet實現了Set介面,實質上封裝了一個HashMap。在HashSet封裝的HashMap中,entry.key為HashSet的元素(從而保證元素的唯一),entry.value統一指向一個static final的Object物件
參考:
本文連結:Java集合類綜合
作者:猴子007
出處:monkeysayhi.github.io
本文基於 知識共享署名-相同方式共享 4.0 國際許可協議釋出,歡迎轉載,演繹或用於商業目的,但是必須保留本文的署名及連結。