一、Set总特性

  1. 核心共性:元素唯一、无索引,仅支持迭代器/增强for/forEach三种遍历,不能通过下标获取元素
  2. ​三大实现类区分
  • HashSet:无序不重复,底层哈希表,查询速度最快​
  • LinkedHashSet:有序不重复,哈希表+双向链表,保留存入顺序
  • TreeSet:自动排序不重复,底层红黑树

二、TreeSet底层:二叉树→红黑树演进

  1. 普通二叉查找树缺陷:有序数据插入会退化成链表,查询效率暴跌
  2. 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)

  1. 底层结构:数组 + 链表 + 红黑树​
  2. 核心参数​
  • 初始容量16,加载因子0.75,扩容阈值=16*0.75=12;元素超阈值数组扩容2倍
  • ​链表长度≥8、数组长度≥64时,链表转为红黑树;链表≤6退化为链表
  1. 去重流程( hashCode() + equals() 双判断)
    ​1.计算元素hash值定位数组下标
    2.下标无元素:直接存入​
    3.下标已有元素:先对比hashCode​
  • hash不同:挂链表存储
  • hash相同:调用 equals() 对比内容
  • equals返回true:判定重复,舍弃元素
  • equals返回false:追加链表

五、hashCode()equals()规范

  1. 自定义实体类存入HashSet必须同时重写两个方法
  2. ​规范逻辑:​- 内容相等的对象:hashCode必须相等,equals返回true​- hashCode相等 ≠ 对象内容相等(哈希碰撞)​
  3. 不重写后果:默认比较内存地址,同属性不同对象会判定为两个元素,无法去重

六、LinkedHashSet

  1. 底层:哈希表+双向链表
  2. ​特点:元素唯一,严格保留插入顺序;性能略低于HashSet

七、开发选型总结

  1. 仅去重、追求最高查询速度 → HashSet(最常用)
  2. ​去重且需要保留存入顺序 → LinkedHashSet​
  3. 去重并自动排序 → TreeSet​
  4. 自定义实体存入Hash系列集合:强制重写hashCode、equals
    5. ​TreeSet存储自定义对象:必须指定自然排序/比较器排序,否则运行报错
Logo

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

更多推荐