hashcode和equals的关系
336
hashcode和equals的关系只有在散列表(哈希表)中才能体现,二者在散列表中相辅相成,发挥作用。在散列表中,需要基于 hashCode 算出元素要插入的数组下标,如果该下标下已经有值,那么说明发生了哈希冲突,这时需要再调用 equals 进行进一步的对比。
二者关系
一般情况下,两个方法没有任何关系。如果我们只需要对比两个对象内容是否相同,调用 equals 即可,hashCode 和 equals 只有在散列表(哈希表)中才能相辅相成,发挥作用。
在散列表中,我们需要基于 hashCode 算出元素要插入的数组下标,如果该下标下已经有值,那么说明发生了哈希冲突,这时我们再调用 equals 进行进一步的对比,并遵循如下规定:
- 当 hashCode 不同时,两个对象肯定不同;
- 当 hashCode 相同时,需进一步调用 equals 对比;
- 当 equals 返回 true 时,两个对象 hashCode 一定相同。
所以当我们需要将某一个类的对象存入散列表时(如 HashMap、HashTable 等),hashCode 和 equals 都必须重写。
拓展阅读
hashcode
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。
equals
equals它的作用也是判断两个对象是否相等,如果对象重写了equals()方法,比较两个对象的内容是否相等;如果没有重写,比较两个对象的地址是否相同,价于“==”。同样的,equals()定义在JDK的Object.java中,这就意味着Java中的任何类都包含有equals()函数。