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回答
同学你好,由于HashSet的底层是HashMap,所以以下回答中都以HashMap为描述对象。
1.并不需要将返回值与每个元素做比较。当尝试存储一个对象时,步骤如下:
(1)计算该对象的哈希码值,并将这个值存储到一个Node对象中;
(2)根据哈希码值和当前数组的长度,可以计算出该对象需要存储在数组的位置,假设这个元素需要存储在下标为4的位置;
(3)如果下标4的位置没有元素,则直接存储;
(4)如果下标4的位置已经有元素,那么将当前对象的哈希码值与已有的所有元素做对比。
(5)如果哈希码值也相同,那么继续调用equals方法去对比属性是否相同。
综上,是只与即将存储的数组下标中,已经存在的对象做对比,而不是所有。
2.(1)调用equals方法的是数组已有的元素,参数是新增的元素;
(2)如上面第一点所述,只有当哈希码值相同时,才会调用equals方法。
祝学习愉快~
相似问题