HashSet集合概述和特点
1.底层数据结构是哈希表
2.不能保证存储和取出的顺序完全一致
3.没有带索引的方法,所以不能使用普通for循环遍历
4.由于是Set集合 所以元素唯一
哈希值(哈希码值)
是JDK根据对象的地址或者属性值,算出来的int类型的整数
Object 类中有一个方法可以获取对象的哈希值
public int hashCode():根据对象的地址值算出来的哈希值
对象的哈希值特点
1.如果没有重写hashCode方法,那么是根据对象的地址值计算出的哈希值。
同一个对象多次调用hashCode()方法返回的哈希值是相同的
2.如果重写了 hashCode方法,一般都是通过对象的属性值计算出哈希值
如果不同对象属性值一样,那么计算出来的哈希值也是一样的
如果HashSet 集合要存储自定义对象。一定要在类里重写equals 跟 hashCode方法,避免输入的数据重复
常见数据结构之哈希表
JDK8 之前 底层采用数组+链表实现
JDK8以后 底层进行了优化 由数组+链表+红黑树实现
HashSet1.7 版本原理解析
HashSet<String> hm = new HashSet<>();
1.创建一个默认长度16,默认加载因为0.75(当数组里存了16*0.75=12个元素的时候,数组会扩容成原来的两倍)的数组 ,数组名table
2.添加元素时首先计算元素的哈希值,根据哈希值判断该在哪里存入元素
3.判断当前位置是否为null,如果是null直接存入
4.如果应存入的位置不是null,表示有元素,则调用equals方法比较属性值
5.如果一样,则不存,如果不一样则存入数组,老元素挂在新元素下面。形成链表
HashSet1.8版本原理解析
底层:哈希表 (数组链表红黑树结合)
当挂在下面的元素过多,不利于添加,也不利于查询
当链表长度超过8的时候,会将链表转换为红黑树
存储流程:计算哈希值——计算应存入的索引——判断是否为空,为空直接存,不为空则根据是链表还是红黑树,用equals方法比较属性值然后判断存入位置
Set集合小结
Set 特点 无需无索引不可重复