本文為「Java 集合框架」系列第二篇,系統梳理 Set 介面五大實現類的底層資料結構、特性、適用場景與線程安全選型建議。
| 實現類 | 底層資料結構 | 有序性 | 線程安全 | 核心特點 |
|---|---|---|---|---|
| HashSet | 哈希表(HashMap) | 無序 | 否 | 查找/插入/刪除 O(1),最常用 |
| LinkedHashSet | 哈希表 + 雙向鏈表 | 插入序 | 否 | 保持插入順序,迭代效率略低於 HashSet |
| TreeSet | 紅黑樹(自平衡 BST) | 自然序/定製序 | 否 | 元素需實現 Comparable 或提供 Comparator |
| ConcurrentSkipListSet | 跳表 | 自然序/定製序 | 是(CAS) | 並發有序 Set,適合高併發排序場景 |
| CopyOnWriteArraySet | 數組(寫時複製) | 插入序 | 是(快照隔離) | 讀多寫少、遍歷無鎖,寫入開銷大 |
HashSet(首選)LinkedHashSetTreeSet(單執行緒)或 ConcurrentSkipListSet(多執行緒)CopyOnWriteArraySetConcurrentSkipListSetHashMap<E, Object>,key 存元素,value 共用 PRESENT 虛擬物件LinkedHashSet 額外維護雙向鏈表記錄插入順序TreeMap<E, Object>,基於紅黑樹實現Comparable<E> 或構造時傳入 Comparator<E>ConcurrentSkipListMap,跳表結構contains、add、remove 原子性保證addAll 等)非原子,需外部同步CopyOnWriteArrayList| 場景 | 推薦 | 理由 |
|---|---|---|
| 高併發、需有序、寫入頻繁 | ConcurrentSkipListSet | CAS 無鎖、O(log n)、支援範圍查詢 |
| 讀多寫少、需遍歷、不可容忍鎖競爭 | CopyOnWriteArraySet | 讀無鎖、遍歷安全、寫入複製數組開銷大 |
| 簡單同步需求 | Collections.synchronizedSet(new HashSet<>()) | 全局鎖、效率較低、不支援併發迭代 |
下一篇將深入剖析 Map 族群:HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap 等核心實現。