Java 集合框架中存在多組名稱相似、功能迥異的核心概念,初學者極易混淆。本文系統梳理 Collection/Collections、Iterator/Iterable 等關鍵差異,並從源碼層面解析設計動機。
| 維度 | Collection | Collections |
|---|---|---|
| 類型 | 介面 | 工具類 |
| 層級 | 集合框架根介面 | 靜態方法容器 |
| 核心功能 | 定義集合基本操作契約 | 提供排序、查找、同步包裝等演算法 |
| 典型方法 | add(), size(), contains(), remove() | sort(), binarySearch(), reverse(), synchronizedList() |
public static <T extends Comparable<? super T>> void sort(List<T> list) {
Object[] array = list.toArray();
Arrays.sort(array); // 核心委派給 Arrays.sort()
ListIterator<T> it = list.listIterator();
for (int i = 0; i < array.length; i++) {
it.next();
it.set((T) array[i]);
}
}
最終由 ComparableTimSort (TimSort 變體) 執行排序,要求元素實作 Comparable 或提供 Comparator。
詳見前文「Iterable 與 Iterator 差異深度解析」,此處補充關鍵設計動機:
cursor 游標屬於遍歷狀態。若 Collection 直接實作,集合對象將攜帶遍歷狀態,導致:iterator() 返回全新實例,狀態天然隔離,支援無限並發遍歷| 介面 | 有序性 | 重複性 | 典型實現 |
|---|---|---|---|
| List | 有序 (插入序) | 允許重複 | ArrayList, LinkedList |
| Set | 無序 (HashSet) / 有序 (LinkedHashSet/TreeSet) | 不允許重複 | HashSet, TreeSet |
| Map | 鍵無序 / 有序 | 鍵唯一 | HashMap, TreeMap |
iterator.remove(),直接 collection.remove() 拋 ConcurrentModificationExceptionequals() 和 hashCode(),否則去重/查找失效Collections.synchronizedXxx() 只保證單方法原子性,複合操作仍需外部同步Arrays.asList() 返回固定大小列表,不可 add/remove,否則拋 UnsupportedOperationExceptionCollection.removeIf(Predicate):條件刪除List.replaceAll(UnaryOperator):元素轉換Map.computeIfAbsent/putIfAbsent/merge:原子性條件更新精通這些核心差異與陷阱,能讓您寫出更健壯、高效的集合操作代碼,避免生產環境隱性 Bug。