Set集合中重写的hashCode和equals方法工作原理是什么?

来源:3-5 equals方法的重写规范

Henry_56

2022-08-24 16:29:34

Set集合在新增数据时先判断数据的hashCode()是否已存在,若hashCode()在Set集合存在再调用equals()进行值比较;hashCode()与equals()都存在的情况下,Set集合才认为数据已存在,不予新增


问题:

如果在Set集合中新增一个元素,

1、那么它是先调用hashCode方法,将返回值和集合中每个元素的哈希值比较吗?

2、是新增的元素调用equals方法吗?那么参数又是谁呢?是将集合中每个元素都做一次参数计算吗?

写回答

1回答

好帮手慕小蓝

2022-08-24

同学你好,由于HashSet的底层是HashMap,所以以下回答中都以HashMap为描述对象。

1.并不需要将返回值与每个元素做比较。当尝试存储一个对象时,步骤如下:

(1)计算该对象的哈希码值,并将这个值存储到一个Node对象中;

(2)根据哈希码值和当前数组的长度,可以计算出该对象需要存储在数组的位置,假设这个元素需要存储在下标为4的位置;

(3)如果下标4的位置没有元素,则直接存储;

(4)如果下标4的位置已经有元素,那么将当前对象的哈希码值与已有的所有元素做对比。

(5)如果哈希码值也相同,那么继续调用equals方法去对比属性是否相同。

综上,是只与即将存储的数组下标中,已经存在的对象做对比,而不是所有。

2.(1)调用equals方法的是数组已有的元素,参数是新增的元素;

   (2)如上面第一点所述,只有当哈希码值相同时,才会调用equals方法。

祝学习愉快~

1

0 学习 · 9886 问题

查看课程