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

JDK 集合框架源碼解析(一):總體架構、核心接口與實現類全景圖

     編輯:Java 綜合教學

前言

Java 集合框架是 JDK 中使用頻率最高的 API,java.util.* 包下 100+ 類/接口構成嚴謹的繼承體系。本文基於 JDK 17 源碼,從頂層接口設計、核心實現類結構、數據結構底層原理、選型決策矩陣四個維度,構建完整認知全景圖。


一、頂層接口架構:雙棲體系


                    ┌─────────────────────┐
                    │   java.lang.Iterable │  ← 根接口,for-each 依賴
                    └──────────┬──────────┘
                               │
              ┌────────────────┼────────────────┐
              ▼                ▼                ▼
       ┌─────────────┐  ┌─────────────┐  ┌─────────────┐
       │ Collection  │  │    Map      │  │  Iterator   │
       └──────┬──────┘  └──────┬──────┘  └──────┬──────┘
              │                │                │
    ┌─────────┼─────────┐      │                │
    ▼         ▼         ▼      ▼                ▼
┌───────┐ ┌───────┐ ┌───────┐             ┌───────────┐
│ List  │ │  Set  │ │ Queue │             │ListIterator│
└───┬───┘ └───┬───┘ └───┬───┘             └───────────┘
    │         │         │
    ▼         ▼         ▼
ArrayList  HashSet  PriorityQueue
LinkedList TreeSet  ArrayDeque
Vector     LinkedHashSet
Stack      CopyOnWriteArraySet

核心接口職責

接口核心契約關鍵方法實現類代表
Iterable可迭代iterator()、forEach()、spliterator()所有 Collection
Collection單一元素容器add/remove/contains/size/isEmpty/toArrayList/Set/Queue
List有序、可重複、索引訪問get/set/add(index)/remove(index)/subListArrayList/LinkedList
Set無序、唯一繼承 Collection,依賴 equals/hashCodeHashSet/TreeSet/LinkedHashSet
QueueFIFO/優先級隊列offer/poll/peek/add/remove/elementArrayDeque/PriorityQueue
Deque雙端隊列addFirst/Last、push/pop、descendingIteratorArrayDeque/LinkedList
Map鍵值映射、Key 唯一put/get/remove/containsKey/keySet/values/entrySetHashMap/TreeMap/ConcurrentHashMap
Iterator單向遍歷hasNext/next/remove/forEachRemaining所有 Collection
ListIterator雙向遍歷、可修改hasPrevious/previous/add/set/nextIndexList 實現類

二、抽象類骨幹:模板方法模式

JDK 提供四大抽象類,實現接口中通用邏輯,子類只需覆蓋核心方法:

抽象類實現接口核心模板方法留給子類的抽象方法
AbstractCollectionCollectiontoString、toArray、contains、removeAll、retainAlliterator()、size()
AbstractListListget/set/add/remove(index)、indexOf、lastIndexOf、listIterator、subListget(index)、size()、set(index, e)、add(index, e)、remove(index)
AbstractSetSetequals、hashCode、removeAll(優化)繼承 AbstractCollection
AbstractQueueQueueadd、remove、element(委託 offer/poll/peek)offer、poll、peek、size

設計精妙:AbstractList.add(E e) 默認調用 add(size(), e),remove(Object o) 默認迭代器查找再調用 remove(index),子類只需實現隨機訪問核心邏輯。


三、核心實現類深度解析

3.1 List 族系

類底層結構特點擴容/縮容線程安全適用場景
ArrayListObject[] 數組隨機訪問 O(1),尾部增刪 O(1),中間增刪 O(n)1.5倍擴容,無自動縮容否默認首選,讀多寫少
LinkedList雙向鏈表頭尾增刪 O(1),索引訪問 O(n),實現 Deque無容量限制,按需分配節點否頻繁頭尾操作、棧/隊列
VectorObject[] 數組方法級 synchronized,2倍擴容2倍擴容是(粗粒度)已過時,用 Collections.synchronizedList 或 CopyOnWriteArrayList
Stack繼承 VectorLIFO,push/pop/peek同 Vector是已過時,用 ArrayDeque
CopyOnWriteArrayList數組 + 寫時復制讀無鎖,寫復制新數組,迭代器弱一致每次寫全量復制是(細粒度)讀多寫極少、遍歷併發安全

3.2 Set 族系

類底層結構有序性線程安全性能特徵
HashSetHashMap (value=PRESENT)無序否O(1) 增刪查,依賴 hashCode/equals
LinkedHashSetLinkedHashMap插入序否雙向鏈表維護順序,迭代有序
TreeSetTreeMap (紅黑樹)自然序/Comparator否O(log n),範圍查詢、有序遍歷
CopyOnWriteArraySetCopyOnWriteArrayList插入序是讀無鎖,寫全量復制
ConcurrentSkipListSet跳表自然序是 (無鎖)O(log n) 期望,高併發有序集合

3.3 Map 族系

類底層結構有序性Null Key/Value線程安全JDK8+ 優化
HashMap數組 + 鏈表 + 紅黑樹無序允許 1 null key,多 null value否鏈表≥8 樹化,≥6 退化
LinkedHashMapHashMap + 雙向鏈表插入序/訪問序同 HashMap否accessOrder=true 實現 LRU
TreeMap紅黑樹Key 自然序/Comparator不允許 null key否NavigableMap 範圍操作
Hashtable數組 + 鏈表無序不允許 null是 (synchronized)已過時
ConcurrentHashMap數組 + 鏈表/紅黑樹 + CAS/synchronized無序不允許 null是 (分段/細粒度)JDK8 擴容協助、CounterCell
WeakHashMapHashMap + WeakReference Key無序允許 null否Key 為弱引用,GC 自動清理
IdentityHashMap線性探測數組無序允許 null否用 == 而非 equals 比較 Key

3.4 Queue/Deque 族系

類底層特點有界性線程安全
ArrayDeque循環數組雙端 O(1),無容量上限,非線程安全無界否
PriorityQueue堆 (數組)最小堆,O(log n) 入隊出隊,無序迭代無界否
LinkedBlockingQueue單向鏈表可選界,鎖分離,高吞吐有界/無界是
ArrayBlockingQueue循環數組有界,單鎖,公平可選有界是
ConcurrentLinkedQueueCAS 鏈表無界,無鎖,弱一致迭代無界是 (無鎖)
SynchronousQueue直接傳遞無緩衝,生產者消費者配對0是
DelayQueuePriorityQueue延遲執行,元素實現 Delayed無界是

四、選型決策矩陣:一表定乾坤

需求首選備選避坑
一般列表,隨機訪問ArrayListVector (舊代碼)頻繁頭部增刪用 LinkedList
頻繁頭尾增刪,棧/隊列ArrayDequeLinkedListLinkedList 內存開銷大、緩存不友好
去重集合,無序HashSetLinkedHashSet (需序)自定義對象必重寫 equals/hashCode
去重 + 保持插入序LinkedHashSetLinkedHashMap.keySet()
去重 + 排序/範圍查詢TreeSetConcurrentSkipListSet (併發)Key 必須 Comparable
鍵值映射,高性能HashMapConcurrentHashMap (併發)Key 正確重寫 hashCode/equals
鍵值映射 + LRU 緩存LinkedHashMap (accessOrder=true)Caffeine/Guava Cache重寫 removeEldestEntry
鍵值映射 + 排序/範圍TreeMapConcurrentSkipListMap (併發)
高併發隊列,生產消費LinkedBlockingQueueArrayBlockingQueue (有界)無界隊列警惕 OOM
線程安全列表,讀多寫少CopyOnWriteArrayListCollections.synchronizedList寫頻繁會大量復制數組
線程安全集合,高併發ConcurrentHashMap.keySet()ConcurrentSkipListSet

五、源碼閱讀路線圖

  1. ArrayList:grow() 擴容、System.arraycopy 移動、SubList 視圖模式
  2. HashMap:putVal() 核心邏輯、treeifyBin() 樹化、resize() 擴容遷移
  3. ConcurrentHashMap:Node[] 數組、CAS 初始化、synchronized 鎖節點、transfer() 並發擴容
  4. ArrayDeque:head/tail 指針環繞、doubleCapacity() 擴容
  5. LinkedHashMap:LinkedNode 雙向鏈表、afterNodeAccess() 訪問序調整
  6. TreeMap:rotateLeft/Right 紅黑樹旋轉、fixAfterInsertion 修復

六、總結

  1. 雙棲體系:Collection(單值)+ Map(鍵值),Iterable 統一迭代入口
  2. 抽象類模板:AbstractCollection/List/Set/Queue 封裝通用邏輯,降低實現門檻
  3. 數據結構決定性能:數組(隨機訪問) vs 鏈表(增刪) vs 紅黑樹(有序) vs 哈希表(O(1)) vs 跳表(併發有序)
  4. 線程安全靠組合:同步包裝器、CopyOnWrite、Concurrent* 系列、無鎖隊列
  5. 選型看場景:讀寫比、有序性、併發度、內存敏感度、功能豐富度

集合框架不是死記硬背 API,而是數據結構、併發控制、內存模型、泛型設計的綜合體現。掌握底層原理,選型才有依據,調優才有方向。

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