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

Java 集合框架深度解析:List、Set、Map、Queue 選型指南

     編輯:Java 相關知識

集合體系宏觀圖譜

Java 容器類層級圖

綠色為接口,紅色為常用實現類。核心分為 Collection(單列)與 Map(雙列)兩大體系。

一、Collection 子體系

1. List - 有序、可重複、可索引

實現底層結構優點缺點適用場景
ArrayList動態數組隨機訪問 O(1),遍歷快中間增刪 O(n) 需搬移元素讀多寫少、頻繁隨機訪問
LinkedList雙向鏈表首尾/中間增刪 O(1),實現 Queue/Deque隨機訪問 O(n),內存佔用大寫多讀少、棧/隊列、頻繁增刪
Vector動態數組線程安全(synchronized)性能差,已被 Collections.synchronizedList 替代極少用

ArrayList 擴容機制(JDK 8)

// 初始容量 10,擴容 1.5 倍
int newCapacity = oldCapacity + (oldCapacity >> 1);

LinkedList 節點結構

static class Node {
    E item;
    Node next;
    Node prev;
}

2. Set - 無序、不可重複

實現底層特點場景
HashSetHashMap查找 O(1),無序去重、快速判斷存在性
LinkedHashSetLinkedHashMap保持插入順序需有序去重
TreeSetTreeMap (紅黑樹)自然序/定制序有序,O(log n)排序去重、範圍查詢

3. Queue - 隊列(FIFO)與優先級隊列

  • LinkedList 實現 Queue/Deque:offer/poll/peek。
  • PriorityQueue:基於堆的優先級隊列,默認自然序(最小值優先),可傳 Comparator 定制。允許重複元素。
  • ArrayDeque:雙端隊列,性能優於 LinkedList,非線程安全。

二、Map 子體系

實現底層特點場景
HashMap數組+鏈表/紅黑樹 (JDK8)查找/插入 O(1),Key 可 null高頻緩存、鍵值存儲
LinkedHashMapHashMap + 雙向鏈表保持插入/訪問順序LRU 緩存、有序遍歷
TreeMap紅黑樹Key 有序,O(log n)範圍查詢、排序映射
Hashtable數組+鏈表線程安全,Key/Value 不可 null已淘汰,用 ConcurrentHashMap
ConcurrentHashMapCAS + synchronized (JDK8)高併發線程安全多線程環境首選

三、迭代器模式與安全刪除

foreach 本質是 Iterator,直接在循環中 list.remove() 會拋 ConcurrentModificationException(modCount 不匹配)。

正確刪除姿勢

Iterator<String> it = list.iterator();
while (it.hasNext()) {
    it.next();       // 必須先 next(),否則 lastRet=-1 拋 IllegalStateException
    if (condition) it.remove();
}

四、工具類:Collections vs Arrays

  • Collections.addAll(list, arr):將數組/可變參數批量加入集合。
  • Arrays.asList(arr):返回固定大小的 List(底層仍是數組),不可增刪,但可修改元素值。

五、選型決策樹(速查)

  1. 需鍵值映射 → Map:高併發 ConcurrentHashMap,有序 LinkedHashMap/TreeMap,一般 HashMap。
  2. 單列數據 → Collection:
    • 需去重 → Set:有序 LinkedHashSet/TreeSet,一般 HashSet。
    • 可重複 → List:隨機訪問 ArrayList,首尾/中間增刪 LinkedList。
    • 隊列語義 → Queue:優先級 PriorityQueue,雙端 ArrayDeque。

總結

Java 集合框架設計精妙,掌握底層數據結構(數組、鏈表、紅黑樹、哈希表)與核心源碼(擴容、modCount、樹化閾值),才能在面對海量數據、高併發、內存敏感等場景時做出最優選型。建議收藏決策樹,實戰中「測試驗證 > 經驗猜測」。

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