哈希值:哈希值是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址值,是模拟出来的,不是数据实际的物理地址)
在object类有一个方法,可以获取对象的哈希值
hashCode:返回对象的哈希值
版本比较
jdk版本之前:哈希表+数组+链表
jdk版本之后 哈希表+链表
哈希表+数组+红黑树(提高查询速度)
数组 :把元素进行分组(相同哈希值的元素是一组)
链表/红黑树:把相同哈希值的元素连接到一起
初始 容量 :16
存储步骤:
- 存储数据到集合中,先计算元素的哈希值
- 然后把元素放在这个哈希值下面,两个元素不同,但是哈希值相同,会造成哈希冲突,这时,形成链表进行存储元素,如果链表的长度超过8位那么就会把链表转换为红黑树(为了提高查询的速度)
Set集合存储元素不重复的原因:
set集合在调用add方法的时候,add方法会调用元素的hashCode方法和equals方法,判断元素是否重复
计算出一个值的hashCode方法,在集合中没有找到这个元素,发现没有,就会把这个元素存储到集合中,如果有,会调用equals方法进行判断,发返false 就进行存储,返回true就不存储