hashCode 与 equals(重要)

本篇博客部分内容摘自Guide哥的原创项目JavaGuide,本人很感谢Guide哥,希望大家支持Guide哥!!!Guide哥项目地址:https://github.com/Snailclimb/JavaGuide


在面试中问到基础问题时,面试官可能会问你:"你重写过 hashcode 和 equals 么,为什么重写 equals 时必须重写 hashCode 方法?"


hashCode()介绍

hashCode() 的作⽤是获取哈希码,也称为散列码;它实际上是返回⼀个 int 整数。这个哈希码的作⽤是确定该对象在哈希表中的索引位置。hashCode() 定义在 JDK 的 Object.java 中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。

散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利 ⽤到了散列码!(可以快速找到所需要的对象)


为什么要有hashCode

我们先以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode: 当你把对象加⼊ HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加⼊的位置,同时也会与该位置其他已经加⼊的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调⽤ equals() 方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

通过这个我们可以看出:hashCode()的作用就是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()在散列表中才有用,在其他情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。


hashCode() 与 equals() 的相关规定

  1. 如果两个对象相等,则hashcode一定是相同的
  2. 两个对象相等,对两个对象分别调用 equals 方法都返回 true
  3. 两个对象有相同的 hashcode 值,它们也不一定是相等的
  4. hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode() ,则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
  5. 两个对象用 equals() 比较返回 true,那么两个对象的 hashCode() 方法必须返回相同的结果
  6. 两个对象用 equals() 比较返回 false,不要求 hashCode() 方法也一定返回不同的值,但是最好返回不同值,以提高哈希表性能
  7. 重写 equals() 方法,必须重写 hashCode() 方法,以保证 equals 方法相等时两个对象 hashcode 返回相同的值

了解完这些之后,我们最后再回到这个问题:两个对象的 hashCode() 相同,则 equals() 也一定为true,对吗?


答案显然是不一定。同时,我们把问题反过来,如果两个对象的 equals 方法为 true ,hashCode 也不一定相同。因为类的 hashCode 方法和 equals 方法都可以重写,返回的值完全在于自己定义。不明白的话可点击此处。

hashCode() 返回该对象的哈希码值;equals() 返回两个对象是否相等。


推荐阅读:

Java hashCode() 和 equals() 的若⼲问题解答

从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

posted @ 2020-08-17 15:08  南笙北沫  阅读(223)  评论(0编辑  收藏  举报