集合框架核心體系概覽
Java 集合框架分為兩大頂層接口:Collection(單列集合)和 Map(雙列鍵值對)。
┌─────────────────────────────────────────────────────────────┐
│ java.util.Collection │
│ (單列集合,存儲單個元素) │
├──────────────┬──────────────┬──────────────┬────────────────┤
│ List │ Set │ Queue │ SortedSet │
│ (有序,可重複)│ (無序,唯一) │ (隊列) │ (有序Set) │
└──────┬───────┴──────┬───────┴──────┬───────┴───────┬────────┘
│ │ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ ArrayList │ │ HashSet │ │ LinkedList │ │ TreeSet │
│ LinkedList │ │ LinkedHashSet│ │ PriorityQueue│ │ │
│ Vector │ │ TreeSet │ │ ArrayDeque │ │ │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
┌─────────────────────────────────────────────────────────────┐
│ java.util.Map │
│ (雙列集合,存儲 key-value,key 唯一) │
├──────────────┬──────────────┬──────────────┬────────────────┤
│ HashMap │ LinkedHashMap│ TreeMap │ Hashtable │
│ (無序,高性能) │ (有序,插入序) │ (有序,按鍵排序) │ (線程安全,舊) │
└──────────────┴──────────────┴──────────────┴────────────────┘
Collection 接口核心方法
| 分類 | 方法 | 說明 |
| 添加 | add(E e) | 添加單個元素 |
| addAll(Collection<? extends E> c) | 批量添加 |
| 刪除 | remove(Object o) | 刪除指定元素 |
| removeAll(Collection<?> c) | 批量刪除 |
| clear() | 清空集合 |
| 判斷 | contains(Object o) | 是否包含元素 |
| isEmpty() | 是否為空 |
| 獲取 | iterator() | 獲取迭代器 |
| size() | 元素數量 |
| 交集 | retainAll(Collection<?> c) | 保留交集 |
| 轉數組 | toArray() | 轉為 Object[] |
List 接口:有序、可重複、支持索引
特有方法(索引相關)
| 方法 | 說明 |
| add(int index, E element) | 指定位置插入 |
| addAll(int index, Collection<? extends E> c) | 指定位置批量插入 |
| remove(int index) | 按索引刪除 |
| set(int index, E element) | 按索引替換 |
| get(int index) | 按索引獲取 |
| subList(int from, int to) | 截取子列表 |
| indexOf(Object o) | 首次出現索引 |
| listIterator() | 列表迭代器(雙向) |
三大實現類對比
| 實現類 | 底層結構 | 線程安全 | 查詢速度 | 增刪速度 | 適用場景 |
| ArrayList | 動態數組 | ❌ | 快 O(1) | 慢 O(n) (需移位) | 查詢多、末尾增刪 |
| LinkedList | 雙向鏈表 | ❌ | 慢 O(n) | 快 O(1) (首尾) | 頻繁增刪、棧/隊列 |
| Vector | 動態數組 | ✅ (synchronized) | 快 | 慢 | 已棄用,用 Collections.synchronizedList |
Set 接口:無序、唯一
HashSet:哈希表,性能最優
- 底層:HashMap (key 為元素,value 為 PRESENT 常量)
- 唯一性判斷:
hashCode() 相同 → equals() 比較
- 插入順序不保證
LinkedHashSet:保持插入順序
- 底層:LinkedHashMap (雙向鏈表維護順序)
- 遍歷順序 = 插入順序
TreeSet:有序(紅黑樹)
- 底層:TreeMap (紅黑樹)
- 自然排序:元素實現
Comparable
- 定制排序:構造器傳入
Comparator
- 唯一性判斷:
compareTo() == 0 或 compare() == 0
Queue 接口:隊列
| 實現類 | 特點 | 適用場景 |
| LinkedList | 雙向鏈表,實現 Deque | 普通隊列、棧 |
| PriorityQueue | 優先隊列(小頂堆) | 任務調度、按優先級處理 |
| ArrayDeque | 循環數組,雙端隊列 | 高性能棧/隊列,非線程安全 |
| BlockingQueue | 阻塞隊列接口 | 生產者消費者模式 |
Map 接口:鍵值對、Key 唯一
核心方法
| 分類 | 方法 |
| 添加 | put(K, V)、putAll(Map) |
| 刪除 | remove(Object key)、clear() |
| 判斷 | containsKey、containsValue、isEmpty |
| 獲取 | get(Object key)、size()、values()、keySet()、entrySet() |
四大實現類對比
| 實現類 | 底層 | 有序性 | Null Key/Value | 線程安全 | JDK 版本 |
| HashMap | 數組+鏈表/紅黑樹 | 無序 | 允許 1個 null key、多 null value | ❌ | 1.2+ |
| LinkedHashMap | HashMap+雙向鏈表 | 插入序/訪問序 | 允許 | ❌ | 1.4+ |
| TreeMap | 紅黑樹 | 按 Key 排序 | 不允許 null key | ❌ | 1.2+ |
| Hashtable | 數組+鏈表 | 無序 | 不允許 null | ✅ (synchronized) | 1.0 (舊) |
| ConcurrentHashMap | CAS+volatile / 紅黑樹 | 無序 | 不允許 null | ✅ (高並發) | 1.5+ |
集合遍歷方式對比
| 方式 | 適用 | 優點 | 缺點 |
| Iterator | Collection | 通用、可刪除 | 只能單向遍歷 |
| ListIterator | List | 雙向、可增刪改、有索引 | 只適用 List |
| for-each | Collection/數組 | 語法簡潔 | 不可修改集合結構 |
| forEach (Java 8) | Collection/Map | 函數式、可並行 | 不可拋出檢查異常 |
| Enumeration | Vector/Hashtable | 舊 API 兼容 | 功能弱、已棄用 |
⚠️ 并發修改異常
// ❌ 錯誤:遍歷時直接用集合方法修改
for (String s : list) {
if ("x".equals(s)) list.remove(s); // ConcurrentModificationException
}
// ✅ 正確:用迭代器刪除
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if ("x".equals(it.next())) it.remove();
}
// ✅ 正確:Java 8 removeIf
list.removeIf("x"::equals);
// ✅ 正確:收集後再刪
List<String> toRemove = new ArrayList<>();
for (String s : list) if ("x".equals(s)) toRemove.add(s);
list.removeAll(toRemove);
Collections 工具類 vs Collection 接口
| Collection | Collections |
| 類型 | 頂層接口 | 工具類 (final class) |
| 方法 | 實例方法 | 靜態方法 |
| 功能 | 定義集合行為 | 排序、查找、同步包裝、不可變視圖 |
Collections 常用靜態方法
// 排序
Collections.sort(list); // 自然排序
Collections.sort(list, comparator); // 定制排序
// 查找 (前提:已排序)
int index = Collections.binarySearch(list, key);
// 同步包裝 (線程安全視圖)
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
Map<K,V> syncMap = Collections.synchronizedMap(new HashMap<>());
Set<E> syncSet = Collections.synchronizedSet(new HashSet<>());
// 不可變視圖 (只讀)
List<String> unmod = Collections.unmodifiableList(list);
Map<K,V> unmodMap = Collections.unmodifiableMap(map);
// 其他
Collections.reverse(list); // 反轉
Collections.shuffle(list); // 隨機打亂
Collections.max/min(collection); // 極值
Collections.frequency(c, o); // 出現次數
Collections.disjoint(c1, c2); // 是否無交集
選型決策樹
需要存儲單個元素?
├─ 需要索引訪問、允許重複 → ArrayList (首選) / LinkedList (頻繁增刪)
├─ 不允許重複、無序 → HashSet (首選)
├─ 不允許重複、保持插入序 → LinkedHashSet
├─ 不允許重複、需要排序 → TreeSet
└─ 隊列操作 (FIFO/LIFO) → ArrayDeque / LinkedList / PriorityQueue
需要存儲鍵值對?
├─ 高性能查找、無序 → HashMap (首選)
├─ 保持插入順序 → LinkedHashMap
├─ Key 需要排序 → TreeMap
├─ 多線程高並發 → ConcurrentHashMap
└─ 歷史兼容 → Hashtable (不推薦)
總結
Java 集合框架設計精妙,核心掌握:Collection/Map 兩大體系、List/Set/Queue 三大子體系、ArrayList/LinkedList/HashSet/HashMap 四大主力實現、遍歷用 Iterator/for-each、線程安全用 Collections.synchronizedXxx/ConcurrentHashMap、避坑 ConcurrentModificationException。實際開發中 90% 場景用 ArrayList 和 HashMap 即可覆蓋。