news 2026/4/20 19:17:40

请你说说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/19 6:16:52

Java程序员转AI大模型:拒绝内卷,用技术沉淀换职业新赛道

当Java开发的岗位竞争进入“内卷”模式,AI大模型的爆发恰好为你打开了职业突破口。你不必担心多年积累的Spring Boot、微服务经验付诸东流——企业级开发锤炼的工程化思维、系统稳定性把控能力,正是大模型从实验室走向生产的“刚需能力”。转型AI大模型&…

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

【收藏必备】2025年AI大模型完全指南:从入门到精通,附获取与使用技巧

本文详细介绍了AI大模型的种类(语言、向量、视觉、多模态等)、获取途径(官方、第三方付费/免费、逆向工程)及使用方法(智能体、提示词优化等)。文章强调尽管AI技术已高度发展,但普通用户使用场景仍有限,旨在帮助小白全面了解大模型生态,掌握从…

作者头像 李华
网站建设 2026/4/17 18:23:20

Fluke福禄克754 753 725 724 726过程校验仪

‌福禄克754(Fluke 754/754 PLUS)是福禄克公司推出的多功能过程校验仪‌,专为工业现场校准、维护和故障诊断设计,支持HART通信协议,可测量和输出电压、电流、温度、压力等多种信号。‌‌ 1‌‌ 2 核心功能与技术特点 ‌…

作者头像 李华
网站建设 2026/4/19 9:38:52

事件冒泡踩坑记:一个TDesign Checkbox引发的思考

最近在项目中遇到一个很"诡异"的问题:点击 t-checkbox 组件时,父元素的点击事件居然被触发了!明明只改了复选框状态,怎么父容器也"跟着动"了?今天就跟大家聊聊这个看似简单却暗藏玄机的事件冒泡问…

作者头像 李华
网站建设 2026/4/17 1:44:26

魔盒项目开发纪实:硬件平台搭建以及调试

引言 今天是我魔盒项目的硬件调试日,这是整个项目从设计到实现的关键一步。魔盒项目旨在打造一个智能的物联网设备,能够感知人体存在并通过灯光提供反馈。在这篇博客中,我将详细记录从开发板选择到传感器调试的全过程,分享遇到的问…

作者头像 李华
网站建设 2026/4/20 11:00:55

解锁神秘:自由振动流致振荡的流场坐标转换与POD分析

自由振动流致振荡等无法提前获取运动规律的流场坐标转换方法(matlab tecplot联合编程)及pod分析方法 含视频教程,实例数据,matlabmcr宏文件等 航空航天,船舶海洋,流体力学等专业必备在航空航天、船舶海洋以…

作者头像 李华