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

Java 容器類深度解析:Collection、List、Map 體系與選型指南

     編輯:Java 程式設計入門

容器類體系總覽

Collection (介面)
├── List (有序、可重複)
│   ├── ArrayList  (動態陣列,非同步)
│   ├── LinkedList (雙向鏈表,非同步)
│   ├── Vector     (動態陣列,同步)
│   └── Stack      (繼承 Vector,LIFO)
└── Set (無序、不可重複)
    ├── HashSet
    ├── LinkedHashSet
    └── TreeSet

Map (介面,不繼承 Collection)
├── HashMap      (非同步,允許 null)
├── Hashtable    (同步,不允許 null)
├── LinkedHashMap
├── TreeMap
└── WeakHashMap  (弱引用 Key)

核心介面詳解

Collection 介面

最基礎集合介面,代表一組 Object。所有實現類必須提供兩個建構子:無參(空集合)、單參 Collection(複製集合)。遍歷統一使用 Iterator:

Iterator<E> it = collection.iterator();
while (it.hasNext()) {
    E element = it.next();
    // 處理 element
}

List 介面:有序、可重複、支援索引

  • 精確控制插入位置
  • 支援 get(index)、set(index, element) 隨機存取
  • ListIterator:雙向遍歷、可新增/刪除/修改

ArrayList:動態陣列

  • 底層 Object[] elementData
  • get/set/size/isEmpty:O(1)
  • add:均攤 O(1),擴容 1.5 倍
  • 插入/刪除中間元素:O(n) 位移開銷
  • 非同步,效能優於 Vector
  • 大量插入前可 ensureCapacity() 預分配

LinkedList:雙向鏈表

  • 首尾操作 O(1):addFirst、removeLast 等
  • 索引存取 O(n) 需遍歷
  • 適合堆疊、佇列、雙端佇列場景
  • 每個元素額外 Node 物件開銷

Vector:同步動態陣列

  • 方法皆 synchronized,執行緒安全
  • 擴容 2 倍
  • 迭代器為 fail-fast:併發修改拋 ConcurrentModificationException
  • 效能較差,單執行緒環境不建議使用

Stack:LIFO 堆疊

  • 繼承 Vector,push/pop/peek/empty/search
  • 同步開銷大,現代建議用 ArrayDeque

Set 介面:不可重複

  • 依賴 equals() 判斷重複
  • 最多一個 null
  • 可變物件加入後勿修改影響 equals() 的欄位

Map 介面:Key-Value 映射

  • Key 唯一,每個 Key 映射單一 Value
  • 三種視圖:keySet()、values()、entrySet()

HashMap:高效雜湊表

  • 非同步,允許 null Key/Value
  • JDK 8+:鏈表轉紅黑樹優化碰撞
  • 迭代開銷與容量成正比,勿設過大初始容量或過小負載因子

Hashtable:同步雜湊表

  • 同步,不允許 null
  • 同樣需正確實作 hashCode() 與 equals()

WeakHashMap:弱引用 Key

  • Key 不再被外部引用時可被 GC 回收
  • 適用快取場景

Key 正確實作 hashCode() 與 equals()

// 核心契約:
// 1. equals 相等 → hashCode 必相等
// 2. hashCode 相等 → equals 不一定相等 (碰撞)
// 3. 必須同時覆寫兩者,否則 HashMap/Hashtable 異常
@Override
public boolean equals(Object o) { ... }
@Override
public int hashCode() { ... }

同步性與選型決策樹

需求推薦備註
單執行緒、高效能隨機存取ArrayList預設首選
頻繁首尾增刪、佇列/堆疊LinkedList / ArrayDequeArrayDeque 非同步且更快
多執行緒共享 ListCollections.synchronizedList() / CopyOnWriteArrayList視讀寫比例選擇
單執行緒、Key-ValueHashMap預設首選
多執行緒共享 MapConcurrentHashMap分段鎖,高併發效能優
需排序 MapTreeMap紅黑樹,O(log n)
需插入順序 MapLinkedHashMap雙向鏈表維序

擴容機制對比

  • Vector:預設 2 倍
  • ArrayList:1.5 倍 (newCapacity = oldCapacity + (oldCapacity >> 1))
  • 大量資料場景:預設初始容量避免頻繁擴容複製

實務建議

  1. 面向介面編程:回傳 List 而非 ArrayList,便於後續替換實現
  2. 避免硬編碼具體類別:List<String> list = new ArrayList<>();
  3. 極致效能:Peter Haggar 建議直接用陣列 String[] 避免同步、方法呼叫、擴容開銷
  4. 迭代器失效:併發修改集合時,使用並發容器或手動同步
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved