1.HashSet


HashSet是基于HashMap来实现的,实现了Set接口,同时还实现了序列化和可克隆化。而集合(Set)是不允许重复值的。

所以HashSet是一个没有重复元素的集合,但不保证集合的迭代顺序,所以随着时间元素的顺序可能会改变。

由于HashSet是基于HashMap来实现的,所以允许空值HashSet,不是线程安全的。 

HashSetHashMapkey 集合的「语义视图」,它不「取」(copy/extract)key,而是「强制将元素作为 key 存入 HashMap」,且 value 固定为哑值 PRESENT

PRESENT 是一个「不可变的、无意义的、全局共享的哨兵对象(sentinel object)」,它的存在只为回答一个问题


2.LinkedHashSet

LinkedHashSetHashSet 的「有序版本」,它牺牲少量内存(+16B/元素)和微小构造开销,换来了 O(1) 查找 + O(1) 插入顺序迭代的完美组合。

3.TreeSet

TreeSet<E>NavigableSet<E> 接口的实现类,其唯一状态是一个 private final TreeMap<E,Object> m; 实例;它将所有 add(e)contains(e)iterator() 等操作,完全委托给 m.put(e, PRESENT)m.navigableKeySet().iterator()TreeSet 的「有序」,就是 TreeMapkeyComparableComparator 排序后的自然遍历顺序。

    Logo

    汇聚全球AI编程工具,助力开发者即刻编程。

    更多推荐