打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
面试官最爱的坑:为什么重写equals时一定要重写hashCode?

https://www.toutiao.com/article/7287041722159661628/?log_from=74d30c4c44f2c_1700626713566

#秋日生活打卡季#

大家好,我是小米,欢迎大家来到我的微信公众号!今天,我们将讨论一个在Java开发中经常被问到的问题:“为什么在重写 equals 方法时也要重写 hashCode 方法?”这个问题可能在你的面试中经常出现,但它不仅仅是一个面试题,它还涉及到了Java中非常重要的概念,即对象的相等性和哈希码。让我们深入探讨这个问题,并了解为什么它如此重要。

equal 和 hashCode 是什么?

在Java中,每个对象都有一个默认的 equals 方法,它比较的是对象的引用是否相等,即比较两个对象是否是同一个实例。但是,在实际开发中,我们通常需要比较对象的内容是否相等,而不仅仅是比较它们的引用。这就是为什么我们需要重写 equals 方法的原因。

哈希码(hashCode)是另一个与对象相关的重要概念。哈希码是一个整数值,它是根据对象的内容计算得出的。在Java中,哈希码主要用于散列数据结构,如哈希表。哈希表是一种常用的数据结构,它可以快速查找存储在其中的对象。哈希码可以帮助我们确定对象在哈希表中的存储位置,从而实现高效的查找操作。

为什么要重写 equals 方法?

默认情况下,Java中的 equals 方法比较的是对象的引用。如果我们不重写 equals 方法,那么对于两个不同的对象,即使它们的内容相同,调用 equals 方法也会返回 false,因为它们的引用不同。

考虑以下示例:

在这个示例中,尽管 person1person2 的内容相同,但它们是不同的对象,因此 equals 方法返回 false。这显然不是我们想要的行为。

为了解决这个问题,我们需要重写 equals 方法,以便比较对象的内容而不是引用。通常,我们会在自定义类中重写 equals 方法,以实现我们自己的相等性逻辑,比较对象的属性是否相等。

为什么要重写 hashCode 方法?

好了,现在我们知道了为什么要重写 equals 方法,但是为什么还需要重写 hashCode 方法呢?这是因为在使用散列数据结构时,比如哈希表,我们希望相等的对象具有相等的哈希码。

在Java中,哈希表使用哈希码来确定存储对象的位置。如果两个相等的对象具有不同的哈希码,那么它们将被存储在哈希表的不同位置,导致无法正确查找这些对象。

考虑以下示例:

在这个示例中,尽管 person3person4 的内容相同,但由于它们具有不同的哈希码,set.contains(person4) 返回 false。这是因为哈希表无法正确定位到 person4

为了解决这个问题,我们需要确保重写 equals 方法的对象也必须重写 hashCode 方法,以便它们的哈希码是相等的。这样,哈希表就能够正确地存储和查找这些对象了。

重写 hashCode 方法的规则

那么,如何正确地重写 hashCode 方法呢?Java对于 hashCode 方法有一些规定,这些规定确保了哈希码的一致性和性能。

以下是一些重写 hashCode 方法的规则:

  • 如果两个对象通过 equals 方法相等,那么它们的哈希码必须相等。
  • hashCode 方法的计算应该是高效的,避免复杂的计算。
  • hashCode 方法的结果应该在对象的生命周期内保持不变。如果一个对象的内容发生了变化,它的哈希码也应该保持不变。
  • 对于不相等的对象,哈希码尽量不要相等,以提高哈希表的性能。

为了遵守这些规则,通常我们可以使用对象的属性来计算哈希码,比如使用属性的哈希码相加或异或来得到对象的哈希码。

示例:重写 equals 和 hashCode 方法

让我们来看一个示例,如何重写 equalshashCode 方法:

在这个示例中,我们重写了 equals 方法,比较了 nameage 属性是否相等,然后重写了 hashCode 方法,使用了 Objects.hash 方法来计算哈希码。

END

为了保证对象的相等性和哈希表的正确性,我们需要在重写 equals 方法时也重写 hashCode 方法。这两个方法是密切相关的,它们一起确保对象在使用散列数据结构时能够正确工作。

当你在面试中遇到这个问题时,不要忘记强调 equalshashCode 方法的一致性和性能,以及遵守重写 hashCode 方法的规则。这将帮助你深刻理解这个重要的概念,并在实际开发中正确地使用它们。

希望这篇文章能够帮助你更好地理解为什么需要重写 equals 方法时也要重写 hashCode 方法。如果你有任何问题或意见,请随时留言,我会尽力解答。谢谢大家的阅读!

如有疑问或者更多的技术分享,欢迎关注我的微信公众号“知其然亦知其所以然”!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Object类中的equals和hashCode方法
用来理解 Java 编程语言的 8 个图表
Java集合总结:Set集合
Flutter Set存储自定义对象时 如何保证唯一
详解 equals() 方法和 hashCode() 方法
在Java中运用Hashtable,Hashmap
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服