HashSet

存储结构:哈希表(数组+链表+红黑树)

HashSet_第1张图片

存储过程

  1. 根据hashcode计算保存的位置,如果此位置为空,则直接保存,如果不为空执行第二步。
  2. 再执行equals方法,如果equals方法为true,则认为是重复,否则,形成链表。

演示过程

创建Person类

HashSet_第2张图片

进入测试类对HashSet进行测试

HashSet_第3张图片

从上图可知当重复添加person3对象时,会在hashcode计算保存的位置,如果此位置为空,则直接保存。

由于已经添加过person3,故此时根据原hashcode方法,重复添加person3时,返回的数组位置应该是一样的。

再执行equals方法,如果equals方法为true,则认为是重复,否则,形成链表。由于添加的是同一对象,故根据equals方法,返回的应为true,故认为重复,不再添加。

这是不重写hashcode和equals方法时hashset添加同一对象的过程。

接下来,在Person类重写hashcode和equals方法

HashSet_第4张图片

进行测试

HashSet_第5张图片

可以发现,通过new一个与person3一样的对象也无法添加入hashset。

原因:

在hashcode方法中通过Person的name属性与age属性进行计算得到要存储的hashset底层的数组的位置,由于新new的Person对象的属性与person3一样,故返回的位置与person3在数组的位置一样。

接下来,进入equals方法,先进行是否为同一对象与非空判断,再进行对新添加的Person对象的属性与数组上该位置的person3对象进行比较,由于new出来的对象属性与person3完全一致,则根据我们重写的equals方法,返回的boolean值应该为true,故不再添加至该数组位置上的链表。

因此,new出来的对象不会被hashset添加。

 

 

你可能感兴趣的:(数据结构,java,链表)