Java集合類綜合

monkeysayhi發表於2017-10-08

Java集合類是JDK學習中的一個經典切入點,也是讓初學者最初感受到Java魅力的地方之一,你一定不會忘記不需要關心大小的ArrayList,不用自己實現的Queue,和隨處可見的HashMap。面試中,對Java基礎的考察中,集合類和String相關是兩個重點,這裡集中整理了關於集合類的一些知識點。

集合類的結構

要求手繪結構圖,同時丟擲一些簡單的線索勾引面試官提問(比如講HashMap的HashTable的區別)。

image.png
image.png

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

  1. HashMap是非執行緒安全的,HashTable是執行緒安全的
  2. 擴容機制相同

HashMap & TreeMap

  1. HashMap實現了Map介面,不保障元素順序。實現原理balabala
  2. TreeMap實現了SortedMap介面,是一個有序的Map。內部採用紅黑樹實現,紅黑樹是一種維護有序資料的高效資料結構,但具體演算法沒有掌握

HashMap & LinkedHashMap

  1. HashMap是無序的;如果希望容器按照自定義順序遍歷可使用TreeMap;如果希望按照插入順序遍歷,可使用LinkedHashMap
  2. 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

  1. HashMap實現了Map介面,原理balabala
  2. HashSet實現了Set介面,實質上封裝了一個HashMap。在HashSet封裝的HashMap中,entry.key為HashSet的元素(從而保證元素的唯一),entry.value統一指向一個static final的Object物件

參考:


本文連結:Java集合類綜合
作者:猴子007
出處:monkeysayhi.github.io
本文基於 知識共享署名-相同方式共享 4.0 國際許可協議釋出,歡迎轉載,演繹或用於商業目的,但是必須保留本文的署名及連結。

相關文章