Set
Java Set 集合详解
Set
是 Java 集合框架中的一个接口,继承自 Collection
,它的特点是不允许存储重复元素,并且可以根据不同实现类选择是否保证元素的顺序。
✅ 1. Set 的特点
- 不允许重复元素:如果向
Set
中添加一个已存在的元素,添加操作会被忽略。 - 无索引:不像
List
,Set
不支持索引访问,只能通过迭代器或增强for
循环遍历。 - 允许存储
null
(但只能有一个null
)。 - 元素顺序不固定(具体顺序由实现类决定)。
✅ 2. Set 的主要实现类
实现类 | 底层数据结构 | 特点 |
---|---|---|
HashSet |
哈希表(HashMap ) |
无序,增删查快(O(1) ) |
LinkedHashSet |
哈希表 + 双向链表 | 有序(按插入顺序) |
TreeSet |
红黑树(自平衡二叉树) | 有序(按自然排序或比较器排序) |
✅ 3. Set 的常用方法
Set
继承了 Collection
接口的方法,没有额外的方法,常见操作包括:
方法 | 作用 |
---|---|
add(E e) |
添加元素(如果存在则不添加) |
remove(Object o) |
删除指定元素 |
contains(Object o) |
判断是否包含指定元素 |
size() |
获取集合大小 |
isEmpty() |
判断集合是否为空 |
clear() |
清空集合 |
iterator() |
获取迭代器 |
✅ 4. HashSet
用法
HashSet
基于 哈希表 实现,不保证元素顺序,插入、删除、查找的时间复杂度 O(1)。
4.1 HashSet
示例
1 |
|
4.2 遍历 HashSet
1 |
|
✅ 5. LinkedHashSet
用法
LinkedHashSet
继承自 HashSet
,但它保留了元素的插入顺序。
示例
1 |
|
✅ 6. TreeSet
用法
TreeSet
基于 红黑树 实现,保证元素按照自然顺序(默认升序)排序,增删查的时间复杂度 O(log n)。
6.1 TreeSet
示例
1 |
|
6.2 自定义排序
可以使用 Comparator
来指定排序规则:
1 |
|
✅ 7. Set
常见问题
7.1 HashSet
为什么无序?
HashSet
基于 HashMap
,元素存储在 哈希桶(Hash Bucket) 里,顺序依赖于哈希值,不会按插入顺序排列。
7.2 如何让 Set
保持顺序?
- 按插入顺序:使用
LinkedHashSet
- 按大小排序:使用
TreeSet
7.3 TreeSet
为什么不能存 null
?
TreeSet
依赖 compareTo()
进行排序,而 null
不能参与比较,因此 TreeSet
不允许 null
元素。
✅ 8. Set vs List 对比
特性 | Set | List |
---|---|---|
是否允许重复 | ❌ 不允许 | ✅ 允许 |
是否有序 | ❌(HashSet )✅(LinkedHashSet 、TreeSet ) |
✅ 保持插入顺序 |
是否支持索引访问 | ❌ | ✅ |
查询效率 | ✅ HashSet O(1) |
❌ O(n) |
插入/删除效率 | ✅ HashSet O(1) |
❌ O(n) |
✅ 9. 总结
实现类 | 特点 |
---|---|
HashSet |
无序,查询快,适用于去重 |
LinkedHashSet |
保持插入顺序 |
TreeSet |
按自然顺序或自定义排序 |
如果需要唯一性 + 高效查询,使用 HashSet
。
如果需要唯一性 + 顺序,使用 LinkedHashSet
。
如果需要唯一性 + 排序,使用 TreeSet
。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Firefly!