Set 集合三剑客:HashSet / TreeSet / LinkedHashSet」
·
一、Set总特性
- 核心共性:元素唯一、无索引,仅支持迭代器/增强for/forEach三种遍历,不能通过下标获取元素
- 三大实现类区分
HashSet:无序不重复,底层哈希表,查询速度最快LinkedHashSet:有序不重复,哈希表+双向链表,保留存入顺序-
TreeSet:自动排序不重复,底层红黑树
二、TreeSet底层:二叉树→红黑树演进
- 普通二叉查找树缺陷:有序数据插入会退化成链表,查询效率暴跌
-
TreeSet底层为红黑树(自平衡二叉树)
¹ 自动平衡节点深度,查询、增删效率稳定
² 左子树 < 当前节点 < 右子树,中序遍历升序输出
三、TreeSet两种排序规则
1.自然排序(默认)
1.1 元素类实现 Comparable 接口,重写 compareTo()
1.2 返回值规则:
- this.属性 - o.属性 :升序
- o.属性 - this.属性 :降序
- 返回0判定元素重复,无法存入
1.3 自带类型(String、Integer)已内置自然排序逻辑
2. 比较器排序(Comparator,优先执行)
2.1 创建TreeSet时传入Comparator匿名内部类/Lambda
2.2 重写compare()方法定义排序逻辑
2.3 优先级:比较器排序 > 自然排序,适合不修改实体类代码时自定义排序
四、HashSet底层原理(JDK8)
- 底层结构:数组 + 链表 + 红黑树
- 核心参数
- 初始容量16,加载因子0.75,扩容阈值=16*0.75=12;元素超阈值数组扩容2倍
- 链表长度≥8、数组长度≥64时,链表转为红黑树;链表≤6退化为链表
- 去重流程(
hashCode() + equals()双判断)
1.计算元素hash值定位数组下标
2.下标无元素:直接存入
3.下标已有元素:先对比hashCode
- hash不同:挂链表存储
- hash相同:调用 equals() 对比内容
- equals返回true:判定重复,舍弃元素
- equals返回false:追加链表
五、hashCode()与equals()规范
- 自定义实体类存入HashSet必须同时重写两个方法
- 规范逻辑:- 内容相等的对象:hashCode必须相等,equals返回true- hashCode相等 ≠ 对象内容相等(哈希碰撞)
- 不重写后果:默认比较内存地址,同属性不同对象会判定为两个元素,无法去重
六、LinkedHashSet
- 底层:哈希表+双向链表
- 特点:元素唯一,严格保留插入顺序;性能略低于
HashSet
七、开发选型总结
- 仅去重、追求最高查询速度 →
HashSet(最常用) - 去重且需要保留存入顺序 →
LinkedHashSet - 去重并自动排序 →
TreeSet - 自定义实体存入Hash系列集合:强制重写
hashCode、equals
5.TreeSet存储自定义对象:必须指定自然排序/比较器排序,否则运行报错
更多推荐



所有评论(0)