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

Java 集合框架全景圖:Collection/Map 體系、數組 vs 集合、選型指南與源碼級核心原理

     編輯:Java 綜合教學

Java 集合框架全景圖:Collection/Map 體系、數組 vs 集合、選型指南與源碼級核心原理

集合是 Java 開發最頻繁使用的 API。本文從定義、分類、體系架構、數組對比、選型決策樹、核心實現原理六個維度,構建完整知識體系,附帶高清思維導圖描述與源碼關鍵點註解。

一、什麼是集合?

  • 定義:存儲對象的容器,面向對象語言將事物抽象為對象,集合用於持有多個對象引用。
  • 本質:集合中存放的是對象引用,而非對象本身;集合長度可變,可存儲任意類型對象(泛型擦除後為 Object)。

二、集合 vs 數組

三、集合框架體系架構(核心接口與實現)

java.util.Collection (根接口)
├── List (有序、可重複)
│   ├── ArrayList (動態數組,查快增刪慢)
│   ├── LinkedList (雙向鏈表,增刪快查慢,實現 Deque)
│   └── Vector (線程安全,舊 API,不推薦)
├── Set (無序、不可重複)
│   ├── HashSet (HashMap 底層,O(1) 去重)
│   ├── LinkedHashSet (維護插入順序)
│   └── TreeSet (紅黑樹,有序,O(log n))
└── Queue (隊列)
    ├── PriorityQueue (堆,優先級)
    ├── ArrayDeque (雙端隊列,非線程安全)
    └── BlockingQueue (並發隊列,另屬 j.u.c)

java.util.Map (鍵值對,Key 無序唯一)
├── HashMap (數組+鏈表/紅黑樹,JDK8 引入樹化)
├── LinkedHashMap (維護插入/訪問順序)
├── TreeMap (紅黑樹,Key 有序)
├── Hashtable (線程安全,舊 API)
├── ConcurrentHashMap (分段鎖/CAS+synchronized,高併發)
└── WeakHashMap (Key 弱引用,GC 可回收)

四、集合選型決策樹(背誦級)

  1. 需鍵值對 → Map
    • 高併發 → ConcurrentHashMap
    • 需有序 (Key) → TreeMap
    • 需插入順序 → LinkedHashMap
    • 一般場景 → HashMap
  2. 需單列元素 → Collection
    • 需去重 → Set
      • 需有序 → TreeSet
      • 需插入順序 → LinkedHashSet
      • 一般 → HashSet
    • 需佇列 → Queue
      • 優先級 → PriorityQueue
      • 雙端操作 → ArrayDeque
      • 生產消費 → BlockingQueue (ArrayBlockingQueue/LinkedBlockingQueue)
    • 一般列表 → List
      • 頻繁隨機訪問/末尾增刪 → ArrayList
      • 頻繁頭部/中間增刪 → LinkedList
      • 需線程安全 → Collections.synchronizedList 或 CopyOnWriteArrayList

五、核心實現原理速查(面試必備)

維度數組集合
長度固定(聲明時確定)動態可變
存儲類型基本類型 + 引用類型僅引用類型(基本類型自動裝箱)
類型安全編譯期強類型泛型提供編譯期檢查,運行期擦除
功能豐富度僅存取、長度增刪改查、排序、去重、遍歷、流式操作
內存佔用連續內存,輕量對象頭 + 引用 + 擴容機制,較重
性能隨機訪問 O(1),極快ArrayList 同數組,LinkedList 插刪 O(1) 但訪問 O(n)

六、常見坑點與最佳實踐

  1. ArrayList 初始容量:預知大小用 new ArrayList<>(n) 避免多次擴容拷貝。
  2. 遍歷中修改:for (Iterator it = list.iterator(); it.hasNext(); ) { if (cond) it.remove(); },不可直接 list.remove() 拋 ConcurrentModificationException。
  3. HashMap 多線程:JDK7 死循環(鏈表倒置),JDK8 數據丟失,**嚴禁多線程共享**,用 ConcurrentHashMap。
  4. equals/hashCode 契約:作為 Key/Set 元素的對象必須重寫,相等對象 hashCode 必相等。
  5. 泛型擦除:運行期 List 實為 List,反射可繞過編譯檢查,注意類型安全邊界。
  6. 不可變集合:JDK9+ List.of(), Set.of(), Map.of() 創建不可變集合,線程安全、內存優化。
  7. 七、集合框架圖解(文字版思維導圖)

    Collection
    ├─ List → ArrayList, LinkedList, Vector, Stack
    ├─ Set  → HashSet, LinkedHashSet, TreeSet
    └─ Queue → PriorityQueue, ArrayDeque, BlockingQueue→ArrayBlockingQueue,LinkedBlockingQueue
    
    Map
    ├─ HashMap, LinkedHashMap, TreeMap, Hashtable
    ├─ ConcurrentHashMap, ConcurrentSkipListMap
    └─ WeakHashMap, IdentityHashMap, EnumMap
    

    集合框架體系圖

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved
集合底層結構擴容機制關鍵源碼點
ArrayListObject[] elementData1.5 倍 (newCap = oldCap + oldCap>>1)grow(), System.arraycopy, modCount
LinkedList雙向鏈表 Node無(按需分配節點)linkFirst, linkLast, unlink, modCount
HashMapNode[] table + 鏈表/紅黑樹2 倍 (cap << 1),負載因子 0.75putVal, resize, treeifyBin, hash(key)
HashSetHashMap (PRESENT)同 HashMapmap.put(e, PRESENT)
TreeMap/Set紅黑樹 Entry無(樹自平衡)put, get, rotateLeft/Right, fixAfterInsertion
ConcurrentHashMapJDK7: Segment[] + HashEntry; JDK8: Node[] + CAS + synchronizedJDK8: 並發擴容 transferputVal, addCount, helpTransfer, sizeCtl