在 Java 中,Set 是一个接口,本身没有“底层实现”,真正的实现是由不同的类来完成的。常见的 Set 实现有:
HashSetLinkedHashSetTreeSetEnumSet(较少用)CopyOnWriteArraySet(并发)ConcurrentHashMap.newKeySet()(并发)下面重点讲最常用的三种 Set 的底层实现原理。
HashSet -> HashMap
HashSet 的底层其实就是 HashMap
private transient HashMap<E,Object> map;
private static final Object PRESENT = new Object();
HashSet 中的元素,作为 HashMap 的 keyvalue 统一使用一个静态对象 PRESENTHashMap 的 key 不可重复 来保证 Set 元素唯一map.put(e, PRESENT)
LinkedHashSet -> LinkedHashMap -> HashMap
HashSetHashMap 基础上增加了 双向链表LinkedHashMap✅ 所以:LinkedHashSet = HashSet + 维护顺序
TreeSet -> TreeMap -> 红黑树(Red-Black Tree)
map.put(e, PRESENT)
compareTo() 或 Comparator 比较| Set 类型 | 底层结构 | 是否有序 | 是否线程安全 | 性能 |
|---|---|---|---|---|
| HashSet | HashMap | 无序 | 否 | 最快 |
| LinkedHashSet | LinkedHashMap | 插入顺序 | 否 | 稍慢 |
| TreeSet | 红黑树 | 排序 | 否 | O(log n) |
HashSet / TreeSet 都不是线程安全
Set<String> set = Collections.synchronizedSet(new HashSet<>());
或
Set<String> set = ConcurrentHashMap.newKeySet();
Java 的 Set 基本都是“借壳”Map 实现的:
- HashSet → HashMap
- LinkedHashSet → LinkedHashMap
- TreeSet → TreeMap
如果你愿意,我也可以画一张 HashMap / HashSet 底层结构图 或结合 源码逐行讲解。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。