1. Set集合基础概念解析
Set是Java集合框架中最具特色的接口之一,它代表着一组不允许重复元素的集合。在实际开发中,我们经常需要处理去重场景,比如用户ID集合、商品SKU列表等,这时Set就成为了不二之选。
与List接口不同,Set不保证元素的插入顺序(LinkedHashSet除外),这个特性源于其底层实现的数学集合特性。我刚开始接触Set时,常常困惑为什么遍历顺序和插入顺序不一致,直到理解了哈希算法的原理才恍然大悟。
Set接口的主要实现类包括:
- HashSet:基于哈希表实现,查询效率O(1)
- TreeSet:基于红黑树实现,元素自动排序
- LinkedHashSet:维护插入顺序的HashSet
注意:Set判断元素重复的标准是equals()和hashCode()方法,这也是为什么我们重写equals()时必须同时重写hashCode()。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心实现原理深度剖析
2.1 HashSet的哈希魔法
HashSet的底层实际上是HashMap,这个设计非常巧妙——它使用HashMap的key来存储元素,value则统一使用一个静态的Object对象占位。这种实现方式既节省了开发成本,又保证了性能。
当添加元素时,HashSet会先计算元素的hashCode:
- 如果该哈希值对应的桶为空,直接插入
- 如果不为空,则调用equals()比较
- equals()返回true视为相同元素,拒绝插入
java复制// 典型HashSet添加元素源码片段
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
哈希冲突处理采用链地址法,Java 8之后当链表长度超过8时会转为红黑树,这个优化让最坏情况下的时间复杂度从O(n)提升到了O(log n)。
2.2 TreeSet的红黑树奥秘
TreeSet的排序能力来自于其底层的TreeMap实现,它维护着一颗红黑树数据结构。红黑树是一种自平衡的二叉查找树,它通过着色和旋转操作保证在最坏情况下也能保持O(log n)的查询效率。
元素比较可以通过两种方式:
- 自然排序:元素实现Comparable接口
- 定制排序:创建TreeSet时传入
