Java 集合框架是日常開發與面試的高頻考點。本文從源碼層面剖析主流集合類的底層資料結構、核心方法實現、效能特徵,並提供實戰選型決策指南。
Collection
├── List (有序、可重複)
│ ├── ArrayList (動態陣列)
│ ├── LinkedList (雙向鏈表)
│ └── Vector (同步動態陣列)
└── Set (無序、不可重複)
├── HashSet (HashMap 鍵值)
├── LinkedHashSet (有序 HashSet)
└── TreeSet (紅黑樹,有序)
Map (鍵值對)
├── HashMap (陣列+鏈表/紅黑樹)
├── LinkedHashMap (維護插入/存取順序)
├── TreeMap (紅黑樹,鍵有序)
├── Hashtable (同步 HashMap)
└── WeakHashMap (弱引用鍵)
Object[] elementData,預設容量 10,擴容 1.5 倍prev | item | next,不佔用連續記憶體Deque,可作棧、佇列使用synchronized,多執行緒安全但效能低Collections.synchronizedList 或並發包替代public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
鍵為元素,值為靜態常量 PRESENT。HashMap 鍵唯一性保證 Set 去重。非同步、允許 null。
繼承 HashSet,內部使用 LinkedHashMap,雙向鏈表串聯節點,迭代順序等於插入順序。
TreeMap,元素需實現 Comparable 或提供 Comparator| 實現類 | 底層結構 | 同步 | Null 鍵/值 | 順序 | 適用場景 |
|---|---|---|---|---|---|
| HashMap | 陣列+鏈表/紅黑樹(JDK8) | 否 | 允許一個 null 鍵、多個 null 值 | 無序 | 高頻查詢、單執行緒 |
| LinkedHashMap | HashMap+雙向鏈表 | 否 | 允許 | 插入/存取順序 | LRU 快取、需順序遍歷 |
| TreeMap | 紅黑樹 | 否 | 不允許 null 鍵 | 鍵自然序/定製序 | 範圍查詢、排序需求 |
| Hashtable | 陣列+鏈表 | 是 | 不允許 | 無序 | 舊版多執行緒,建議用 ConcurrentHashMap |
| ConcurrentHashMap | CAS+synchronized+節點鎖(JDK8) | 段鎖/節點鎖 | 不允許 | 無序 | 高併發讀寫 |
initialCapacity,減少擴容開銷Iterator.remove() 或並發集合hashCode() 與 equals()理解集合底層資料結構與演算法複雜度,是寫出高效、穩健 Java 程式的前提。實際專案中應根據業務訪問模式、併發需求、資料規模綜合選型,而非單純追求「通用」。建議閱讀 JDK 源碼(ArrayList、HashMap、ConcurrentHashMap 為優先),深入掌握擴容、樹化、並發控制等核心邏輯。