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

Java 集合框架核心體系速覽:List、Set、Map 三大介面與主流實作特徵

     編輯:Java 綜合教學

集合框架核心介面架構

Collection (介面)
├── List (有序、可重複)
│   ├── ArrayList (動態陣列,查詢快)
│   ├── LinkedList (雙向鏈表,增刪快)
│   └── Vector (同步,舊版遺留)
└── Set (無序、不可重複)
    ├── HashSet (雜湊表,O(1) 查詢)
    ├── LinkedHashSet (鏈表+雜湊,保持插入序)
    └── TreeSet (紅黑樹,有序、O(log n))

Map (介面,鍵值對)
├── HashMap (雜湊表,通用首選)
├── LinkedHashMap (保持插入/存取序)
├── TreeMap (紅黑樹,Key 有序)
├── Hashtable (同步,舊版遺留)
└── ConcurrentHashMap (高併發首選)

三大核心介面特徵對比

介面有序性重複性典型實作核心用途
List✅ 插入序✅ 允許重複ArrayList, LinkedList有序清單、索引存取、佇列/棧
Set❌ (除 LinkedHash/Tree)❌ 唯一HashSet, TreeSet去重、集合運算 (交/並/差)、唯一性檢查
Map❌ (除 LinkedHash/Tree)Key 唯一,Value 可重複HashMap, TreeMap鍵值映射、快取、索引、分組統計

主流實作選型指南

List 選型

  • ArrayList:預設首選。隨機存取 O(1),尾部增刪攤還 O(1),中間增刪 O(n)。記憶體緊湊。
  • LinkedList:頻繁頭部/中間增刪、實作 Queue/Deque 時。隨機存取 O(n),記憶體開銷大 (節點物件)。
  • Vector:棄用。同步開銷大,單執行緒用 ArrayList,多執行緒用 Collections.synchronizedList 或 CopyOnWriteArrayList。

Set 選型

  • HashSet:預設首選。O(1) 含有判斷,無序。
  • LinkedHashSet:需保持插入順序遍歷。稍大記憶體。
  • TreeSet:需自然序/自訂序遍歷、範圍查詢 (subSet, headSet)。O(log n)。

Map 選型

  • HashMap:預設首選。O(1) 存取。
  • LinkedHashMap:需保持插入順序 (LRU 快取利器 removeEldestEntry)。
  • TreeMap:需 Key 排序、範圍查詢。
  • Hashtable:棄用。全鎖同步,效能差。改用 ConcurrentHashMap。
  • ConcurrentHashMap:高併發讀寫首選。JDK 8+ CAS + synchronized + 紅黑樹。

遍歷方式總結

Map 遍歷最佳實踐

// 推薦:entrySet (單次查找 Key+Value)
for (Map.Entry entry : map.entrySet()) {
    K key = entry.getKey();
    V value = entry.getValue();
}

// 避免:keySet + get (雙重查找)
for (K key : map.keySet()) {
    V value = map.get(key); // 額外 hash 查找
}

// Java 8+ Lambda
map.forEach((k, v) -> System.out.println(k + "=" + v));

常見操作複雜度速查 (平均情況)

方式適用對象優點缺點
for-each (增強 for)Collection, Map (entrySet/keySet/values)簡潔、唯讀安全無法移除元素、無索引
IteratorCollection可安全移除 (iterator.remove())語法較繁瑣
ListIteratorList雙向、可修改、可獲取索引僅 List 可用
forEach (Lambda)Collection, Map函數式、可並行 (parallelStream)除錯較難、檢查型異常處理繁瑣
傳統 for (索引)List, Array完全控制、可修改結構冗長、易越界
操作ArrayListLinkedListHashSetTreeSetHashMapTreeMap
get(index/key)O(1)O(n)--O(1)O(log n)
add(element)O(1)*O(1)O(1)O(log n)O(1)O(log n)
remove(index/key)O(n)O(n)O(1)O(log n)O(1)O(log n)
containsO(n)O(n)O(1)O(log n)O(1)O(log n)
iterator 遍歷O(n)O(n)O(n)O(n)O(n)O(n)

* 攤還常數時間,擴容時為 O(n)

新手必記黃金法則

  1. 面向介面宣告:List<String> list = new ArrayList<>(); 而非 ArrayList<String> list = new ArrayList<>();
  2. 指定泛型:new ArrayList<String>() 而非 new ArrayList()
  3. 預估初始容量:new ArrayList<>(expectedSize) 減少擴容複製
  4. 不可變集合:Java 9+ List.of(), Set.of(), Map.of() 建立唯讀集合
  5. 並發安全:多執行緒寫入必須用 Concurrent 類或同步包裝,Collections.synchronizedList 僅方法級同步,複合操作仍需外部鎖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved