java Set集合,不同特点和相同点;注意点有哪些;已经每一个的底层实现原理,以及不同的对比
一、Set 集合的相同点
无论是 HashSet、LinkedHashSet 还是 TreeSet,它们都继承了 java.util.Set 接口,因此具有以下共同特性:
-
不允许重复元素
-
判断重复依赖
equals()和hashCode()方法(TreeSet 特例:用比较器compareTo()或Comparator)。
-
-
无索引
-
不能像
List那样用get(int index)直接访问。
-
-
支持迭代器遍历
-
都支持
Iterator和增强for循环。
-
-
线程不安全
-
多线程操作时需要手动加锁或用
Collections.synchronizedSet()包装。
-
-
允许 null 元素(TreeSet 除外)
-
HashSet、LinkedHashSet最多允许一个null。
-
二、Set 的不同点
| 集合类型 | 元素顺序 | 允许 null | 是否排序 | 底层结构 | 时间复杂度(增删查) |
|---|---|---|---|---|---|
| HashSet | 无序(哈希表) | 允许 1 个 | 否 | HashMap | 平均 O(1) |
| LinkedHashSet | 插入顺序 | 允许 1 个 | 否 | LinkedHashMap | 平均 O(1) |
| TreeSet | 按自然/比较器排序 | 否 | 是(有序) | TreeMap | O(log n) |
三、注意事项
-
hashCode() / equals() 规则
-
如果重写了
equals(),必须重写hashCode(),否则会导致HashSet、LinkedHashSet元素重复判断出错。
-
-
TreeSet 元素要求
-
必须实现
Comparable接口,或在构造TreeSet时提供Comparator,否则运行时会抛ClassCastException。
-
-
null 元素
-
TreeSet不允许null,因为比较器无法比较null与其他对象。
-
-
线程安全
-
默认不安全,多线程环境要加锁或使用
ConcurrentSkipListSet(线程安全且有序)。
-
-
性能差异
-
HashSet、LinkedHashSet插入/查找比TreeSet更快,因为TreeSet需要维护有序结构。
-
四、底层实现原理
1. HashSet 无序,不重复,无索引
-
数据结构:基于
HashMap -
实现方式:
public class HashSet<E> implements Set<E> { private transient HashMap<E,Object> map; private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT) == null; } } -
工作流程:
-
调用
hashCode()计算哈希值。 -
哈希值经过扰动函数计算桶位置。
-
桶内用
equals()判断是否已存在。 -
如果不存在则插入。
-
2. LinkedHashSet 有序,不重复,无索引
-
数据结构:基于
LinkedHashMap -
特点:
-
继承
HashSet,在哈希表基础上加 双向链表 维护插入顺序。
-
-
优点:
-
遍历时顺序可控(按插入顺序)。
-
-
原理:
-
每个节点额外保存
before和after指针,形成链表结构。
-
3. TreeSet 有序,不重复,无索引
-
数据结构:基于
TreeMap(红黑树) -
特点:
-
元素有序(默认自然顺序)。
-
插入、查找、删除时间复杂度 O(log n)。
-
-
原理:
-
每次插入节点时,按
compareTo()或Comparator规则在红黑树中定位位置。 -
保证树的平衡性,避免退化成链表。
-
五、总结对比图
| 特性 | HashSet | LinkedHashSet | TreeSet |
|---|---|---|---|
| 是否有序 | ❌ | ✅ 按插入顺序 | ✅ 按排序顺序 |
| 是否允许null | ✅1个 | ✅1个 | ❌ |
| 查找效率 | 高 O(1) | 高 O(1) | 中 O(log n) |
| 底层结构 | HashMap | LinkedHashMap | TreeMap(红黑树) |
| 适用场景 | 无序快速去重 | 有序快速去重 | 有序集合、范围查询 |
注意:Set要用到的常量方法,基本上就是 Collection 提供的!自己几乎无额外新增的常用功能!
更多推荐


所有评论(0)