Collection (I)
└─ Set (I) // 無重複元素
├─ AbstractSet // 骨架實現,equals/hashCode 標準實現
│ ├─ HashSet // 基於 HashMap,無序,O(1)
│ ├─ LinkedHashSet // 繼承 HashSet,基於 LinkedHashMap,插入序
│ └─ TreeSet // 基於 TreeMap(紅黑樹),有序,O(log n)
└─ EnumSet / CopyOnWriteArraySet / ConcurrentSkipListSet ... (專用)
| 特性 | HashSet | LinkedHashSet | TreeSet |
|---|---|---|---|
| 底層結構 | HashMap (雜湊表) | LinkedHashMap (雜湊表+雙向鏈表) | TreeMap (紅黑樹) |
| 順序 | 無序 | 插入順序(或訪問順序) | 自然順序/Comparator 定製序 |
| null 元素 | 允許 1 個 | 允許 1 個 | 不允許 (比較器拋 NPE) |
| 時間複雜度 | O(1) 平均 | O(1) 平均 | O(log n) 保證 |
| 記憶體開銷 | 中等 | 較高 (額外鏈表節點) | 最高 (樹節點+比較器) |
| 線程安全 | 否 | 否 | 否 |
| 主要用途 | 高效去重、集合運算 | 保持插入序、LRU 快取 | 區間查詢、有序遍歷、導航操作 |
TreeSet(或高併發 ConcurrentSkipListSet)。LinkedHashSet。HashSet。ConcurrentHashMap.newKeySet() (無序) 或 ConcurrentSkipListSet (有序)。EnumSet (位向量,極致效能)。CopyOnWriteArraySet。Set a = new HashSet<>(Arrays.asList(1,2,3)); Set b = new HashSet<>(Arrays.asList(2,3,4)); // 聯集 Set union = new HashSet<>(a); union.addAll(b); // {1,2,3,4} // 交集 Set inter = new HashSet<>(a); inter.retainAll(b); // {2,3} // 差集 Set diff = new HashSet<>(a); diff.removeAll(b); // {1} // 判斷子集 boolean isSub = a.containsAll(b); // false
new HashSet<>(expectedSize)。equals/hashCode,保持一致性。iterator.remove() 或收集後批量處理)。Set.of(e1, e2...) (Java 9+) 或 Collections.unmodifiableSet()。Set 架構清晰:AbstractSet 骨架 + 三大主流實現各司其職。
HashSet 通用首選,LinkedHashSet 保序,TreeSet 導航。
併發場景轉 JUC 對應實現,特殊類型用專用 Set。