HashSet底层存储
前提:
HashSet
在存储数据时的规则 :会比较hash值(散列值),如果相同会调用equals比较内容
-
无序性:不等于随机性—>不等于添加的顺序
-
存储的数据在底层数组中并非数组索引添加
-
而是根据数据的hash值决定的
-
不可重复性:保证添加的元素按照equals方法判断时 不能返回true 相同元素只能添加一个
-
二、添加元素的过程 HashSet说明
-
1.根据元素的hash来决定存储位置 如果要存储的位置没有元素则直接添加进去
-
2.如果有元素 2.1 判断两者hash值是否一样 不一样则添加成功 --> 采用链表存储
-
2.2 如果两者hash值一样 会调用equals方法进行比较 如果内容也一样则添加失败
-
如果内容不一样 添加成功 七上八下
-
- 注意: 如果hash值不一样 内容一定不一样不需要对比每个元素
-
如果hash值一样 里面内容可能一样或不一样 所以在调用equals
-
- JDK7 元素a放在数组,指向原来元素
-
JDK8 原来元素放在数组,指向元素a
-
- HashSet底层:数组 + 链表
*/
- HashSet底层:数组 + 链表
- 修改p1的name属性导致p1hash值发生改变,但是元素位置不变
- remove删除时,判断的是1001,"CC“的hash值,没有删除
- 添加1001,“CC”,当前位置是空的,添加成功
- 添加1001,“AA”,发现hash值对应的位置有元素(因为原位置并没发生变化),调用equals比较内容,发现不一致,链表存储,存在后面。