文章目录
1、Set集合特点
在学习Set集合之前我们应该学习Collection接口中的常用方法。因为Set集合是Collection的子接口。也就是说当我们使用Set集合时,我们不仅可以使用Collection接口提供的所有操作,还可以使用Set接口提供的特殊操作。
关于Collection提供的方法,在之前的List集合中我们已经说过了,这里不再说。
点击进入List集合底层原理
在探究底层原理之前,我们再来看一下集合的整体结构和Set集合的特点
2、HashSet集合的底层原理
HashSet集合的特点:无序、不重复、无索引
根据HashSet集合的特点,我们思考两个问题:
- 为什么添加元素时无序、不重复、无索引
- 增删改查数据有什么特点,适合什么场景
哈希值
我们先来介绍一下哈希值
HashSet集合底层原理
HashSet扩容原理
在Java中,HashSet是通过数组和链表(或红黑树)实现的。当Hashset中的元素个数达到负载因子(默认0.75)乘以当前容量时,就会触发扩容操作。
HashSet在扩容时会创建一个新的更大的数组,并将原有数组中的元素重新计算哈希值,然后放入新数组的对应位置。这个过程称为rehashing (再哈希)。
具体的扩容过程如下:
- 创建一个新的两倍大小(原容量乘以2) 的数组
- 遍历原数组中的每个非空元素。
- 对每个元素重新计算哈希值,并将其插入新数组的对应位置。如果多个元素计算得到的哈希值相同,则以链表(或红黑树)的形式存储。
- 将新数组设置为HashSet的底层数组,更新容量值.
通过扩容,HashSet能够保持较低的负载因子,减少哈希冲突,提高性能和效率。但同时,扩容过程也需要重新计算哈希值和重新插入元素,可能会涉及较大的数据迁移开销,因此在设计HashSet时需要考虑合适的初始容量和负载因子,以避免频繁扩容。
HashSet集合去重复机制
红黑树介绍
3、LinkedHashSet集合的底层原理
LinkedHashSet集合特点:有序、不重复、无索引
4、TreeSet集合底层原理
- TreeSet集合特点:不重复、无索引、可排序(默认升序排序,按照元素的大小,由小到大排序)
- 底层原理:基于红黑树实现的排序
注意:
- 对于数值类型:Integer,Double,默认按照数值本身的大小进行升序排序。
- 对于字符串类型:默认按照首字符的编号升序排序
- 对于自定义类型如Student对象,TreeSet默认是无法进行直接排序的
5、集合应用场景