首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 集合框架核心知識點總結:List、Set、Map 實現原理與選型指南

     編輯:Java 綜合教學

Java 集合框架核心知識點總結:List、Set、Map 實現原理與選型指南

面試時發現自己對集合底層「知其然不知其所以然」,趁機系統梳理。本文覆蓋 Collection 體系架構、主流實現類數據結構、線程安全性、性能特點及選型建議,作為查漏補缺的速查手冊。

一、集合框架頂層設計

java.util.Collection (介面)
 ├─ List (有序、可重複)
 │    ├─ ArrayList  (動態數組)
 │    ├─ LinkedList (雙向鏈表)
 │    ├─ Vector     (同步動態數組,舊)
 │    └─ Stack      (Vector 子類,LIFO)
 └─ Set (無序、唯一)
      ├─ HashSet   (HashMap 鍵)
      ├─ LinkedHashSet (鏈表+哈希,保持插入序)
      └─ TreeSet   (紅黑樹,有序)

java.util.Map (介面)
 ├─ HashMap      (數組+鏈表/紅黑樹)
 ├─ LinkedHashMap (保持插入/訪問序)
 ├─ TreeMap      (紅黑樹,Key 有序)
 ├─ Hashtable    (同步,舊)
 └─ ConcurrentHashMap (分段鎖/CAS,高並發)

二、List 族群深度解析

實現類底層結構線程安全隨機訪問增刪(頭/尾/中)適用場景
ArrayList動態數組❌✅ O(1)尾部 O(1) / 頭部、中間 O(n)讀多寫少、頻繁隨機訪問
LinkedList雙向鏈表❌❌ O(n)頭/尾 O(1) / 中間 O(n)頻繁頭尾增刪、實現隊列/棧
Vector動態數組✅ (方法級 synchronized)✅同 ArrayList⚠️ 已棄用,推薦 Collections.synchronizedList 或 CopyOnWriteArrayList
Stack繼承 Vector✅--⚠️ 推薦 Deque (ArrayDeque)

擴容機制: ArrayList 1.5 倍擴容(JDK 8+),ensureCapacity() 可預分配減少拷貝。

三、Set 族群:唯一性的守門人

實現類底層有序性Null 支持性能特點
HashSetHashMap無序允許 1 個 null增刪查 O(1),依賴 hashCode/equals
LinkedHashSetHashMap + 雙向鏈表插入序允許 1 個 null比 HashSet 稍慢,但可預測遍歷順序
TreeSetTreeMap (紅黑樹)自然序/定製 Comparator❌ (拋 NPE)增刪查 O(log n),支持範圍查詢

四、Map 族群:鍵值映射的核心

HashMap (JDK 8+) 核心機制

  • 數組 + 鏈表 + 紅黑樹:鏈表長度 ≥ 8 且數組長度 ≥ 64 時轉紅黑樹,退化鏈表攻擊防禦
  • 擴容:負載因子 0.75,容量翻倍,高位掩碼重新分佈
  • 非線程安全:多線程 put 可能導致死循環 (JDK 7) 或數據丟失

ConcurrentHashMap 演進

  • JDK 7:Segment 分段鎖 (16 段),讀無鎖,寫鎖段
  • JDK 8+:放棄 Segment,採用 CAS + synchronized (節點首部) + 紅黑樹,粒度更細,性能更強

其他 Map

  • LinkedHashMap:雙向鏈表維護順序,可實現 LRU 緩存 (removeEldestEntry)
  • TreeMap:紅黑樹,Key 有序,支持 subMap、headMap 範圍查詢
  • Hashtable:全表鎖,已淘汰

五、線程安全集合最佳實踐


// 1. 同步包裝器 (性能一般,迭代器需手動同步)
List syncList = Collections.synchronizedList(new ArrayList<>());

// 2. 併發包專用類 (推薦)
List cowList = new CopyOnWriteArrayList<>(); // 讀多寫少
Map chm = new ConcurrentHashMap<>(); // 高並發 Map
Queue queue = new ConcurrentLinkedQueue<>(); // 無界非阻塞隊列
Deque deque = new LinkedBlockingDeque<>();   // 有界阻塞雙端隊列

六、選型速查決策樹

  1. 需要 鍵值映射 → Map
    • 高並發 → ConcurrentHashMap
    • 需有序遍歷 → LinkedHashMap (插入序) / TreeMap (Key 排序)
    • 一般場景 → HashMap
  2. 需要 唯一集合 → Set
    • 需排序/範圍查 → TreeSet
    • 需保持插入序 → LinkedHashSet
    • 一般去重 → HashSet
  3. 需要 列表 → List
    • 頻繁隨機訪問/尾部增刪 → ArrayList
    • 頻繁頭尾增刪/實現隊列棧 → LinkedList / ArrayDeque
    • 多線程讀多寫少 → CopyOnWriteArrayList

集合框架是 Java 開發的高頻基建,理解底層數據結構(數組、鏈表、紅黑樹)、線程安全機制(鎖、CAS、COW)才能在性能調優、並發 Bug 排查、面試應對中遊刃有餘。建議收藏對照查閱,並親自閱讀 JDK 源碼(ArrayList.java、HashMap.java、ConcurrentHashMap.java)加深印象。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved