HashSet
HashSet
哈希值:是JDK根据对象的地址或者属性值,算出来的int类型的整数。
Object类中有一个方法可以获取对象的哈希值
- public int hashCode(): 根据对象的地址值计算出来的哈希值
对象哈希的特点
- 如果没有重写hashCode方法,那么是根据对象的地址值计算出的哈希值。
- 同一个对象多次调用,哈希值相同。不同对象的哈希值是不一样的
- 如果重写了hashCode方法,一般都是通过对象的属性值计算出哈希值
- 如果不同的对象属性值是一样的,那么计算出来的哈希值也是一样的。
JDK8以前,底层采用数组+链表实现
- HaseSet1.7版本原理解析
HashSet<String> hm = new HashSet<>();
创建一个默认长度16.默认加载因子为0.75的数组,数组名table- 根据元素的哈希值跟数组的长度计算出应存入的位置
- 判断当前位置是否为null,如果是null直接存入
- 如果应存入的位置不为null,表示有元素,则调用equals方法比较属性值
- 如果一样,则不存,如果不一样,则存入数据,老元素挂在新元素下面
- HashSet1.8版本原理解析
- 当挂在下面的元素过多,那么不利于添加,也不利于查询,所以在JDK1.8以后,当链表长度超过8的时候,自动转换为红黑树,存储流程不变
练习:如果HashSet集合要存储自定义对象,那么必须重写hashCode和equals方法。