Java Set系列集合详解:HashSet、LinkedHashSet、TreeSet底层原理与使用场景

Java Set系列集合详解:HashSet、LinkedHashSet、TreeSet底层原理与使用场景


一、Set系列集合概述

1. 核心特点

  • 无序性:存取顺序不一致(LinkedHashSet除外)。
  • 唯一性:元素不重复。
  • 无索引:无法通过索引直接访问元素,不能使用普通for循环遍历。

2. 常见实现类

实现类特点底层数据结构
HashSet无序、唯一、无索引哈希表(数组+链表/红黑树)
LinkedHashSet有序(存取顺序一致)、唯一哈希表+双向链表
TreeSet可排序(自然或自定义)、唯一红黑树

二、Set接口常用方法

Set继承自Collection接口,常用方法如下:

方法说明
boolean add(E e)添加元素,成功返回true
void clear()清空集合
boolean remove(E e)删除指定元素
`boolean contains(Object)判断是否包含元素
int size()返回集合元素个数

三、各实现类详解

1. HashSet

底层原理
  • JDK8前:数组 + 链表。
  • JDK8后:数组 + 链表 + 红黑树(链表长度≥8且数组长度≥64时触发转换)。
  • 哈希值计算:通过重写hashCode()equals()保证元素唯一性。
扩容机制
  • 默认初始容量:16。
  • 加载因子:0.75(当元素数量达到容量的75%时触发扩容)。
代码示例
Set<String> set = new HashSet<>();
set.add("A");
set.add("A"); // 添加失败
System.out.println(set); // 输出无序,如 [A, B]

2. LinkedHashSet

核心特点
  • 继承自HashSet,通过双向链表维护插入顺序。
  • 性能略低于HashSet,但遍历效率更高。
代码示例
LinkedHashSet<String> linkedSet = new LinkedHashSet<>();
linkedSet.add("B");
linkedSet.add("A");
System.out.println(linkedSet); // 输出顺序固定为 [B, A]

3. TreeSet

排序规则
  • 自然排序:元素需实现Comparable接口,重写compareTo()
  • 比较器排序:创建TreeSet时传入Comparator自定义规则。
代码示例
// 自然排序(按年龄升序)
TreeSet<Student> treeSet = new TreeSet<>();
treeSet.add(new Student("Tom", 20));
treeSet.add(new Student("Alice", 18));
// 输出按年龄排序:Alice(18) → Tom(20)

四、补充知识点

1. 线程安全性

  • HashSetTreeSetLinkedHashSet非线程安全
  • 解决方案:使用Collections.synchronizedSet()包装。
Set<String> syncSet = Collections.synchronizedSet(new HashSet<>());

2. 哈希冲突解决策略

  • 链地址法(HashSet采用):冲突元素以链表形式存储。
  • 开放寻址法:线性探测或二次探测。

3. 红黑树简介

  • 一种自平衡二叉查找树,保证插入、删除、查找的时间复杂度为O(log n)
  • 特性:节点颜色交替、根节点为黑、叶子节点为黑、任意路径黑节点数相同。

4. 性能对比

操作HashSetLinkedHashSetTreeSet
插入O(1)O(1)O(log n)
删除O(1)O(1)O(log n)
查询O(1)O(1)O(log n)
有序性插入顺序自然/自定义

五、应用场景总结

场景推荐集合
去重且无需顺序HashSet
去重且保留插入顺序LinkedHashSet
去重且需排序TreeSet
高频查询HashSet
需要线程安全Collections.synchronizedSet()

六、常见面试题

  1. HashSet如何保证元素唯一?
    通过hashCode()equals()方法:先比较哈希值,再通过equals判断内容是否相同。

  2. TreeSet两种排序方式如何选择?

    • 默认使用自然排序(需实现Comparable)。
    • 若类无法修改或需多规则排序,使用Comparator
  3. HashSet和HashMap的关系?
    HashSet底层基于HashMap实现,元素存储为HashMap的键(值固定为PRESENT占位对象)。


关注博主,获取更多Java集合框架深度解析!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值