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

Java 集合框架核心總結:List、Set、Map 選型指南、Iterator 模式與源碼級性能分析

     編輯:Java 綜合教學

Java 集合框架核心總結

集合是動態數組,性能高、易擴展。本文梳理 Collection 體系、List/Set/Map 三大介面核心實現、選型決策、Iterator 遍歷模式及源碼級性能特徵。

1. 體系架構速覽


Collection (interface)
├── List (有序、可重複)
│   ├── ArrayList  (動態數組,擴容 1.5x)
│   ├── Vector     (同步,擴容 2x,舊API)
│   └── LinkedList (雙向鏈表,實現 Queue/Deque)
├── Set (無重複)
│   ├── HashSet    (HashMap 底層,無序,O(1))
│   ├── LinkedHashSet (鏈表維護插入序)
│   └── TreeSet    (紅黑樹,有序,O(log n))
└── Queue
    ├── PriorityQueue (堆,O(log n))
    └── ArrayDeque    (環形數組,O(1) 首尾)

Map (interface)
├── HashMap      (數組+鏈表/紅黑樹,JDK8 鏈表轉樹閾值 8)
├── LinkedHashMap (雙向鏈表維護插入/訪問序)
├── TreeMap      (紅黑樹,Key 有序)
├── Hashtable    (同步,舊API,Key/Value 不可 null)
└── ConcurrentHashMap (CAS+Synchronized 分段鎖/JDK8 鏈表轉樹)

2. List 選型指南

實現底層隨機訪問頭尾增刪中間增刪線程安全擴容
ArrayListObject[]O(1) ✓O(1) 擴容均攤O(n) 需搬移否1.5x
VectorObject[]O(1)O(1)O(n)是 (方法級 synchronized)2x
LinkedListNode 雙向鏈表O(n)O(1) ✓O(1) 定位後否無

口訣:常查、尾插 → ArrayList;首尾頻增刪、當隊列/棧 → LinkedList;極少用 Vector(性能差、API 老舊)。

3. Set 選型指南

實現底層有序性查找/增刪Null 元素
HashSetHashMap<E,Object>無序O(1)允許 1 個
LinkedHashSetHashMap + 雙向鏈表插入序O(1)允許 1 個
TreeSetTreeMap (紅黑樹)自然序/Comparator 序O(log n)不允許

4. Map 選型指南

實現底層Key 有序Null Key線程安全JDK8 優化
HashMapNode[] + 鏈表/樹無序允許 1 個否鏈表長度≥8 && 數組≥64 → 紅黑樹
LinkedHashMapHashMap + 雙向鏈表插入序/訪問序允許 1 個否同上
TreeMap紅黑樹自然序/Comparator不允許否—
HashtableEntry[] + 鏈表無序不允許是 (synchronized)—
ConcurrentHashMapNode[] + 鏈表/樹 + CAS無序不允許高並發安全JDK8 擴容協助、鏈表轉樹

5. Iterator 遍歷模式


// 通用遍歷
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String s = it.next();
    // it.remove(); // 安全刪除當前元素
}

// for-each (語法糖,底層同 Iterator)
for (String s : list) { ... }

// Map 遍歷三種
for (Map.Entry<K,V> e : map.entrySet()) { ... }  // 推薦
for (K k : map.keySet()) { V v = map.get(k); }   // 兩次查找
map.forEach((k,v) -> { ... });  // Java 8 Lambda

6. 核心源碼性能細節

  • ArrayList 擴容:grow() → newCapacity = old + (old >> 1),Arrays.copyOf 複製數組
  • HashMap Put:hash(key) → (n-1)&hash → 索引,衝突鏈表/樹化,resize() 2倍擴容並重新分佈
  • HashMap Get:同樣索引定位,鏈表遍歷/樹查找
  • ConcurrentHashMap:JDK7 Segment 分段鎖;JDK8 synchronized(Node) + CAS + Node[] 細粒度鎖,size() 用 LongAdder 累加
  • LinkedHashMap:accessOrder 為 true 時 get() 會將節點移至尾部,實現 LRU 緩存

7. 避坑清單

  1. 集合聲明用接口類型:List<String> list = new ArrayList<>()
  2. 構造時指定初始容量:new ArrayList(1000) 減少擴容
  3. 遍歷時刪除必須用 Iterator.remove(),不可直接 list.remove() (CME)
  4. HashMap Key 必須正確重寫 equals/hashCode
  5. 多線程環境:Collections.synchronizedList 或 CopyOnWriteArrayList / ConcurrentHashMap
  6. 避免在循環中創建大量集合對象,復用或預分配

精通集合框架的底層數據結構與性能特徵,是寫出高性能 Java 代碼、通過高級面試的核心基本功。

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