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

Java Set 集合架構全景:HashSet、TreeSet、LinkedHashSet 核心差異與選型指南

     編輯:Java 相關知識

一、Set 介面體系總覽

Collection (I)
  └─ Set (I)           // 無重複元素
       ├─ AbstractSet  // 骨架實現,equals/hashCode 標準實現
       │    ├─ HashSet      // 基於 HashMap,無序,O(1)
       │    ├─ LinkedHashSet // 繼承 HashSet,基於 LinkedHashMap,插入序
       │    └─ TreeSet      // 基於 TreeMap(紅黑樹),有序,O(log n)
       └─ EnumSet / CopyOnWriteArraySet / ConcurrentSkipListSet ... (專用)

二、三大主流實現核心對比

特性HashSetLinkedHashSetTreeSet
底層結構HashMap (雜湊表)LinkedHashMap (雜湊表+雙向鏈表)TreeMap (紅黑樹)
順序無序插入順序(或訪問順序)自然順序/Comparator 定製序
null 元素允許 1 個允許 1 個不允許 (比較器拋 NPE)
時間複雜度O(1) 平均O(1) 平均O(log n) 保證
記憶體開銷中等較高 (額外鏈表節點)最高 (樹節點+比較器)
線程安全否否否
主要用途高效去重、集合運算保持插入序、LRU 快取區間查詢、有序遍歷、導航操作

三、選型決策樹

  1. 需要有序/區間查詢/導航 → TreeSet(或高併發 ConcurrentSkipListSet)。
  2. 需要保持插入順序 → LinkedHashSet。
  3. 純去重、極致效能、不關心順序 → HashSet。
  4. 多線程高併發 → ConcurrentHashMap.newKeySet() (無序) 或 ConcurrentSkipListSet (有序)。
  5. 元素為 Enum 類型 → EnumSet (位向量,極致效能)。
  6. 讀多寫少、需快照迭代 → 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

五、最佳實踐清單

  • 建構大 Set 時預估大小:new HashSet<>(expectedSize)。
  • 元素類正確覆寫 equals/hashCode,保持一致性。
  • 避免在迭代時直接修改原 Set(用 iterator.remove() 或收集後批量處理)。
  • 需不可變 Set:Set.of(e1, e2...) (Java 9+) 或 Collections.unmodifiableSet()。
  • 序列化場景確保元素可序列化。

六、總結

Set 架構清晰:AbstractSet 骨架 + 三大主流實現各司其職。
HashSet 通用首選,LinkedHashSet 保序,TreeSet 導航。
併發場景轉 JUC 對應實現,特殊類型用專用 Set。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved