1.HashSet介绍
1.HashSet的特点
- 无序,无索引,唯一
2.HashSet的根据什么来确定元素位置
- HashSet是根据对象的哈希值,来确定元素在集合中的存储位置,因此具有良好的存取和查找性能
3.HashSet的底层数据结构
- HashSet的底层是哈希表
4.什么是哈希表
- JDK1.8前,哈希表采用数组+链表,就是使用链表来处理哈希冲突,但是当同一个hash值链表的元素较多时,要对链表元素进行操作时效率较低
- JDK1.8后,哈希表采用数组+链表+红黑树,当同一个hash值上链表的元素超过阈值(8)时,将链表转换为红黑树(二分查找),这样会大大减少元素操作时间

5.Set如何保证元素唯一 - Set通过hashCode与equals来保证元素唯一
- HashSet在元素存储前,会根据元素的hashCode方法计算出一个哈希值(代表元素存储位置)
-
当该哈希值上无元素时,直接将元素存储到该位置 -
若该哈希值上有元素时,此时这种情况为哈希冲突 - 当发生哈希冲突时,再用该元素的equals方法逐个与这个哈希值上的所有元素进行比较
-
比较结果为真,则该元素已重复 -
比较结果为假,则该元素不重复
6.为什么HashSet要用hashCode方法
- 因为使用hashCode的方法会将元素尽可能的分配在不同的哈希值空间内,可以只进行一个哈希值空间内的元素判断,大大提高效率。
7.为什么HashSet要用equals方法
- 因为元素进行哈希值运算时,可能会出现哈希冲突,这时需要进行equals判断元素是否相同。
8.补充
- 虽然HashSet保证元素唯一,但是元素无序,为了实现有序
- 可以使用HashSet的子类LinkedHashSet,它是链表+哈希表的结构,可以实现数据的有序存取和元素唯一
2.源码剖析
待续…
本文详细解读了HashSet的数据结构特点,如何利用哈希值确定位置,保证元素唯一性的机制,以及为何使用hashCode和equals方法。同时介绍了JDK1.8前后哈希表的变化。最后提到LinkedHashSet的有序特性。

1852

被折叠的 条评论
为什么被折叠?



