news 2026/4/16 15:41:54

请你说说hashCode()和equals()的区别,为什么重写equals()就要重写hashCode()

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
请你说说hashCode()和equals()的区别,为什么重写equals()就要重写hashCode()

区别:

equals()方法用于比较两个对象是否相等。默认情况下(从Object类继承),它比较的是两个对象的引用是否指向同一内存地址。但通常我们会重写它,以便根据对象的内容(即属性值)来比较是否相等。

hashCode()方法返回对象的哈希码值,主要用于支持哈希表(如HashMap、HashSet等)的高效性能。默认情况下,hashCode()返回对象的内存地址的整数形式。

几乎在所有情况下,如果一个类重写了 equals 方法,那么它也必须重写 hashCode 方法。 这是一个在 Java 中非常重要且必须遵守的契约,定义在 Object 类的规范中。

String、Integer、Long、LocalDate 等所有标准的 Java 类库中的值类都严格遵守了这条规则。

为什么重写equals()就要重写hashCode():

这是因为Java规范中规定:如果两个对象根据equals()方法比较是相等的,那么它们的hashCode()方法必须返回相同的整数。反之,如果两个对象的hashCode()返回相同的值,它们不一定相等(因为哈希冲突可能发生)。

这一规定主要是为了确保哈希表(如HashMap、HashSet等)的正确工作。哈希表使用哈希码来快速定位元素,如果两个相等的对象返回不同的哈希码,那么将它们放入哈希表(例如作为键)时,可能会导致无法正确找到之前放入的对象,从而违反哈希表的设计原则。

举个例子:假设我们重写了某个类的equals()方法,使得两个属性相同的对象被认为是相等的,但没有重写hashCode()方法。那么这两个对象可能返回不同的哈希码(因为默认的hashCode()与内存地址相关)。当我们将第一个对象放入HashSet后,再尝试用第二个对象(与第一个对象相等)去检查HashSet是否包含它时,由于哈希码不同,HashSet可能在错误的哈希桶中查找,从而返回false,尽管这两个对象是相等的。

因此,为了保证在使用哈希表时对象行为一致,重写equals()方法时通常也需要重写hashCode()方法,并确保相等的对象具有相等的哈希码。

如何重写:

重写equals()方法时,通常比较对象的所有相关属性。

重写hashCode()方法时,通常使用相同的属性来计算哈希码,可以使用Java中的Objects.hash()方法来简化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 9:26:10

一文讲清楚Spring中的三级缓存(附完整流程演示)

01-三级缓存的核心目的Spring 三级缓存主要解决两个核心问题:单例 Bean 的循环依赖问题:Bean A 依赖 Bean B,Bean B 又依赖 Bean AAOP代理与循环依赖的兼容问题:在循环依赖场景下,如何确保注入的是正确的代理对象02-三…

作者头像 李华
网站建设 2026/4/16 9:24:25

[Python实战] 告别浏览器驱动烦恼:用 Playwright 优雅实现网页自动化

在日常的网页自动化任务中,我们经常会遇到一个令人头大的问题:浏览器驱动的管理。无论是 Selenium 还是 Puppeteer,都离不开各种浏览器驱动,如 ChromeDriver、GeckoDriver 等。这些驱动不仅版本繁多,而且常常因为浏览器…

作者头像 李华
网站建设 2026/4/16 9:23:13

32、COM+ 技术:数据传输与管理的利器

COM+ 技术:数据传输与管理的利器 1. COM+ 管道技术 在 COM(Component Object Model)中,标准的封送技术最初旨在尽可能隐藏 RPC(Remote Procedure Call)机制的细节。当客户端调用方法时, [in] 参数会被传输到服务器,而 [out] 参数会在调用结束时返回。通常情况下,…

作者头像 李华
网站建设 2026/4/15 12:26:13

2026年PMP考试大变革,不要错过最佳报考时机!

当今竞争激烈的职场中,拥有一张高含金量的专业证书,往往能为你的职业生涯打开一扇新的大门。而PMP(项目管理专业人士资格认证),正是这扇门后最受认可的国际通行证之一。它由美国项目管理协会(PMI&#xff0…

作者头像 李华
网站建设 2026/4/16 3:27:12

车床产线互联关键:Profinet转Modbus网关技术解析

在工业自动化领域,车床作为一种重要的机械设备,其性能的优劣直接关系到生产效率和产品精度。为了提高车床的操作效率和精确度,我们采用开疆智能profinet转modbus网关KJ-PNG-201,这是一种先进的通讯技术,它在车床中的应…

作者头像 李华
网站建设 2026/4/16 11:09:45

python-uniapp微信小程序的社区老人服务管理系统_lz9wo71q

文章目录系统截图项目技术简介可行性分析主要运用技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!系统截图 python-uniapp_lz9wo71q 微信小程序的社区老人服务管理系统 项目技术简介 Python版本&#x…

作者头像 李华