Effective Java笔记(11)覆盖 equals 时总要覆盖 hashCode

为什么覆写equals的时候一定要覆写hashCode? 经常在论坛上面看到复写hashCode函数的问题,很多情况下是一些开发者不了解hash code,或者和equals一起用的时候不太清楚为啥一定要复写hashCode。对于hash code的理论我不想多说,这个话题太大。我只想说用hash code的原因只有一个:效率。理论的说法它的复杂度只有O(1)。试想我们把元素放在线性表里面,每次要找一个元素必须从头一个一个的找它的复杂度只有O(n)。如果放在平衡二叉树,复杂度也有O(log n)。接下来说为啥很多地方说“覆写equals的时候一定要覆写hashCo 阅读详情

        在每个 覆盖了 equals 方法的类中,都 必须 覆盖 hashCode 方法 。 如果不这样做的话,就会违反 hashCode 的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这类集合包括 HashMap 和 HashSet 。 下面是约定的内容,摘自 Object 规范:

  • 1、在应用程序的执行期间,只要对象的 equals 方法的比较操作所用到的信息没有被修改,那么对同一个对象的多次调用,hashCode 方法都必须始终返回同一个值 。在一个应用程序与另一个程序的执行过程中,执行 hashCode 方法所返回的值可以不一致 。
  • 2、如果两个对象根据 equals(Object )方法比较是相等的,那么调用这两个对象中的 hashCode 方法都必须产生同样的整数结果 。
  • 3、如果两个对象根据 equals(Object )方法比较是不相等的,那么调用这两个对象中的 hashCode 方法,则不一定要求 hashCode 方法必须产生不同的结果 。 但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列表( hash table )的性能 。

        因没有覆盖 hashCode 而违反的关键约定是 第二条:相等的对象必须具有相等的散到码( hash code ) 。 根据类的 equals 方法,两个截然不同的实例在逻辑上有可能是相等的,但是根据 Object 类的 hashCode 方法,它们仅仅是两个没有任何共同之处的对象 。因此,对象的 hashCode 方法返回两个看起来是随机的整数,而不是根据第二个约定所要求的那样,返回两个相等的整数 。

        不要试图从散列 码计算 中排 除掉一个对 象 的 关键域来提高性能 。 虽然这样得到的散列函数运行起来可能更快,但是它的效果不见得会好,可能会导致散列表慢到根本无法使用 。特别是在实践中,散列函数可能面临大量的实例,在你选择忽略的区域之中,这些实例仍然区别非常大 。 如果是这样,散列函数就会把所有这些实例映射到极少数的散列码上,原本应该以线性级时间运行的程序,将会以平方级的时间运行 。

        不要对 hash Code 方法的返回值做出具体的规定,因此客户端无法理所当然地依赖它;这样可以为修改提供灵活性 。Java 类库中的许多类,比如 String 和 Integer ,都可以把它们的 hashCode 方法返回的确切值规定为该实例值的一个函数。一般来说,这并不是个好主意,因为这样做严格地限制了在未来的版本中改进散列函数的能力 。 如果没有规定散列函数的细节,那么当你发现了它的内部缺陷时,或者发现了更好的散列函数时·,就可以在后面的发行版本中修正它 。

        总而言之,每当覆盖 equals 方法时都必须覆盖 hashCode ,否则程序将无法正确运行 。
hashCode 方法必须遵守 Object 规定的通用约定,并且必须完成一定的工作,将不相等的散列码分配给不相等的实例 。 

EfficientNet中的MBConv模块详解:为什么它能如此高效? 本文深度解析了EfficientNet中的MBConv模块,详细介绍了其核心设计理念、效率优化技术和复合缩放理论。MBConv通过深度可分离卷积、倒残差结构和注意力机制三大关键技术,实现了计算效率与模型性能的平衡,成为高效网络结构设计的典范。 阅读详情

相关推荐

Flink CDC 1.18.1 Oracle 数据同步到postgresql

8、修改Flink的配置文件,主要是各种服务的绑定地址,默认为localhost,统统改为0.0.0.0,如:rest.address: 0.0.0.0 #localhost。将flink-sql-connector-oracle-cdc-3.0.1.jar复制到flink-1.18.1/lib目录中。6、下载 flink-connector-jdbc-3.1.1-1.17.jar,postgresql-42.7.3.jar。7、安装postgresql就不说了,相信你已经有了数据库了。

ynzhangyao的专栏 1799

java hashcode 例子_java 覆盖hashCode()深入探讨 代码演示样例

java 翻盖hashCode()深入探讨 代码演示样例package org.rui.collection2.hashcode;/*** 覆盖hashcode* 设计HashCode时最重要的因素 就是:不管何时,对同一个对象调用HashCode都应该产生相同的值,* 假设你的HashCode方法依赖于对象中易变的数据,用户就要当心了,由于此数据发生变化 时* HashCode就会生成一个不同的...

weixin_36410293的博客 225

汇川伺服驱动器参数优化实战指南

本文详细介绍了汇川伺服驱动器参数优化的实战技巧,涵盖控制模式选择、电子齿轮比调整、刚性匹配与振动抑制等关键内容。通过实际案例和实用技巧,帮助工程师快速掌握伺服驱动器参数调校方法,提升设备运行精度和稳定性。特别针对高精度定位和高速响应场景提供了专业指导。

weixin_29070721的博客 735

了解hashCode()方法及其在Java中的重要性

hashCode方法是Object类中的一个方法,用于返回对象的哈希码(不是返回内存地址,是一种随机算法生成的随机数,jvm启动时可以通过参数来改变对象hashcode生成规则哈希码是一个整数值,用于快速查找对象在哈希表中的位置。这个值在对象的生命周期内是固定的,只有当对象发生变化时,hashCode值才会改变。

weixin_56390908的博客 651

chmod: changing permissions of `/u01/app/oracle/product/11.2.0/dbhome_1/bin/extjobO‘: Operation not

oracle 11.2.0.4安装psu 29141056,日志末尾抛出报错 Patching component oracle.ctx, 11.2.0.4.0... Applying sub-patch '29141056' to OH '/u01/app/oracle/product/11.2.0/dbhome_1' Patching component oracle.rdbms, 11.2.0.4.0... Patching component oracle.rdbms.rman, 11.2.0.

m0_37625564的博客 1833

华为OD机试_2025 B卷_模拟消息队列(Python,100分)(附详细解题思路)

时间排序:确保事件处理顺序正确消费者管理:集合操作高效维护状态优先级实现:利用消费者ID自然排序边界处理:正确处理空消费者情况。

测试工程师的成长之路 1119

Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系

Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系

qq_43966957的博客 512

emwin与Modbus通信结合:项目实例

通过实际项目讲解emwin界面设计与Modbus通信协议的融合应用,深入剖析数据交互流程。掌握emwin在工业控制场景中的实用技巧,提升系统人机交互与稳定通信能力。

weixin_34618526的博客 483

第九条:覆盖equals时总是要覆盖hashCode

在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。 一、Object.hashCode的通用约定 1) 只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法都必须始终如一的返回同一个整数。在一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致。 2)如果两个对象根据equals方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。 3)如果两个对象根据equals方法比较是不相等的,

m0_55268339的博客 475

NA400与昆仑通态MODBUS/TCP通讯调试说明

点击增加设备通道,弹出窗口进行设置,通道类型选择“0区输出继电器”,通道地址为1,通道个数为1,读写方式为读写。点击增加设备通道,弹出窗口进行设置,通道类型选择“4区输出寄存器”,数据类型选择“16位 无符号二进制”,通道地址为21001,通道个数为1,读写方式为读写。5.添加设备通道:双击莫迪康MODBUSTCP子设备,点击添加设备通道,根据Modbus规约地址表进行参数的设置,表格可在NAPro软件帮助中查看,如下图所示。然后可以在设备通道调试数据中观察到Q1的值为1,NW1的值678,表示通讯成功。

weixin_44281509的博客 2490

6.5 构网型储能系统的协同控制策略

本文系统阐述了构网型储能系统的协同控制策略,重点分析了多机组群协同运行面临的功率分配不均、动态响应失配等挑战。研究提出了改进型下垂控制与虚拟阻抗法、基于一致性算法的分布式协同控制等解决方案,探讨了构网型储能与同步发电机在惯性响应、一次调频等方面的协同机制,以及与跟网型电源在电压支撑、阻抗重塑等方面的互补作用。文章构建了分层控制架构,为实现多类型电源的全局优化运行提供了技术路径,对提升高比例新能源电力系统的稳定性具有重要意义。

技术工作者 1004

覆盖equals时总要覆盖hashCode

覆盖equals时总要覆盖hashCode   一个很常见的错误根源在于没有覆盖hashCode方法。在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样做,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,这种集合包括HashMap、HashSet和Hashtable。   下面是约定的内容,摘自Object规范[Ja...

weixin_30520015的博客 159

图像做旧算法原理及代码解释

该图像做旧算法主要通过一系列的图像处理操作来模拟旧照片的效果。整体流程包括:首先对输入图像进行颜色调整,降低饱和度并增加黄色调以营造出旧照片的色彩风格;接着添加高斯噪声来模拟旧照片可能存在的颗粒感;最后通过在图像上随机绘制线条来模拟旧照片的划痕和瑕疵。综上所述,该图像做旧算法通过对颜色的调整(包括饱和度降低、色相偏移)、添加高斯噪声以及模拟划痕和瑕疵等一系列操作,从多个方面模拟了旧照片的特征。

m0_44975814的博客 901

《Effective Java》解读第11条:覆盖equals时总要覆盖hashCode

摘要:本文强调了覆盖equals方法时必须同时覆盖hashCode方法的重要性。根据Object规范,两个逻辑相等的对象必须产生相同的哈希码,否则在使用HashMap、HashSet等集合时会出现问题。文章通过示例说明了不覆盖hashCode导致的错误行为,并详细介绍了如何正确实现hashCode方法,包括使用31作为合并因子、处理不同字段类型等。最后指出可以使用Objects.hash()简化实现,以及需要注意缓存哈希值、不省略关键字段等细节,确保哈希方法的正确性和性能。

Cosmoshhhyyy的博客 675

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

《Effective Java》第11条:覆盖 equals 时总要覆盖 hashCode

原文P42:因为hashCode这个方法返回的结果是一个简单、确定的计算结果,它的输入只是PhoneNumber实例中的三个关键域,因此相等的 PhoneNumber 实例显然都会有相等的散列码。其实这就会有一个问题。1、在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对同一个对象的多次调用,hashcode方法都必须始终返回同一个值。(这句话的翻译我也是服了,不知所云,实际想表达的意思是,当多次运行某个程序的时候,每次运行产生的hashCode可以是不一致的。

TD_FAlmK的博客 661

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

为什么在覆盖equals时一定也要覆盖hashCode

为什么在覆盖equals时一定也要覆盖hashCode?因为先hashmap, 后equals !下面用HashMap来阐述原因,首先假设key1和key2的值在业务逻辑领域是相等的,即它们应该是同一个对象,HashMap已经存储了key1,现在要查找key2是否存在,正确的结果应该是存在。Java中的HashMap实际上是一个链表数组,即首先HashMap是一个数组,然后数组中的每一个元素是一个链

wusuopuBUPT的专栏 1830

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java:Effective java学习笔记之 覆盖equals时总要覆盖hashcode

Java覆盖equals时总要覆盖hashcode覆盖equals时总要覆盖hashcode1. 什么是hashcode方法?2. hashcode相等与对象相等之间的关系:(保证设计是规范的前提下)3. 为什么要覆盖hashcode参考 覆盖equals时总要覆盖hashcode 1. 什么是hashcode方法? 首先我们要了解一下散列表是什么? 散列表就是我们平时所说的哈希表,是根据键值对(Key - value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加

JMW1407的博客 630

覆盖equals时总要覆盖 hashCode Effective java第三章第十一条

学习 hashCode Effective java第三章第十一条 覆盖equals时总要覆盖 !!!错误2:使用可变字段!!!

qq_47129343的博客 842

Effective Java 对于所用对象都通用的方法 9.覆盖equals时总要覆盖hashCode

相信在使用快捷键覆盖equals方法时,总会伴随着hashCode,很多初学者不知道equals跟hashCode在实体类中的作用,我初学时也不知道。使用的比较多的就是字符串调用equals方法,但是跟实体类中的equals方法没有半毛钱关系。正是因为覆盖equals方法时,会覆盖hashCode,所以就没有遇到过其中的错误。每个覆盖了equals方法的类中,也必须覆盖hashCode方法。这属于乌

yancyang的博客 2万+

《Effective Java》阅读笔记9 覆盖equals时总要覆盖hashCode

1. 什么是hashcode方法? hashcode方法返回对象的哈希码值 在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有改变,那么对于这同一个对象调用多次,hashcode方法都必须返回同一个整数。 hashcode的存在主要用于查找的快捷性,如Hashtable,HashMap等,hashcode是用来在散列存储结构中确定对象的存储地址的。 2. hashcode相等与对象相等之间的关系:(保证设计是规范的前提下) 如果两个对象相同,那么两个对象的hashcode也

weixin_41563161的博客 361

Effective Java 覆盖equals时总要覆盖hashCode

一. Object.hashCode通用约定 1. 在应用程序执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法都必须始终如一地返回同一个整数. 在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致 2. 如果两个对象根据equals(Object)方法比较是想等的,那么调用两个对象总任意一个对象的hashCode方法都必须产生同样的整数结果 3. 如果两个对象根据equals(Object)方法比较是不想等的,那么

菜园子丶For丨丶Tomorrow的博客 179

Effective Java -- 重写equals时必须重写hashCode

此系列文章为本人对《Effective Java》一书的学习笔记,主要是记录对书中重点内容的理解。既然有缘看到此文,那么希望能对你有所帮助。本文对应原书 第11条 覆盖equals时总要覆盖hashCode

心之所往 码之所向 318

Effective Java 【对于所有对象都通用的方法】第11条 覆盖equals时总要覆盖hashCode

覆盖equals时总要覆盖hashCode 在每个覆盖率equals方法的类中,都必须覆盖hashCode方法。如果不这样做,就违反了hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运行,这类集合包括HashMap和HashSet(所有用到哈希表的地方),下面是约定内容,摘自Object规范: 在应用程序的执行期间,只要对象的equals方法比较操作所有的信息没有被修改,那么对同一个对象的多次调用,hashCode方法都必须返回同一值。在一个应用程序与另一个应用程序的执行过程中,

zhangxiaoxiao9527的博客 330

Effective Java之改写equals时总要改写hashCode

改写equals时总要改写hashCodehashCode,就是哈希值,可以理解为一个对象的标识(好的hash,能确保不同的对象有不同的hash值),Object含有hashCode方法,用来返回对象的hash值。hashCode方法多用在基于散列值的集合类,比如HashMap、HashSet和Hashtable。下面是hashCode的约束规范, 在一个应用程序执行期间,如果一个对象的equa

u014088294的专栏 1635

Effective Java笔记第二章对所有对象都通用的方法第二节覆盖equals时总要覆盖hashCode

Effective Java笔记第二章对所有对象都通用的方法 第二节覆盖equals时总要覆盖hashCode 1.在每个覆盖了equals方法的类中,也必须覆盖hashCode方法,如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap,HashSet和Hashtable。 2.Object.hashCode的通用约定: 1)在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对

zh123456_789的博客 211

Effective Java - 对于所有对象都通用的方法 - 覆盖 equals 时请总要覆盖 hashCode

读书笔记 仅供参考Object.hashCode 通用约定如果在覆盖了 equals 方法的类中没有覆盖 hashCode 方法,就会违法 Object.hashCode 的通用约定,导致所有基于 hash 的集合无法正常运作。 约定如下 在应用程序的执行期间,只要对象的 euqals 方法的比较操作所用的信息没有被修改,那么对于同一个对象的调用多次,hashCode 方法都必须始终如一返回同一个

wujunyucg的博客 323
上一篇: Effective Java笔记(10)覆盖 equals 时请遵守通用约定
下一篇: Effective Java笔记(12)始终要覆盖 toString
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值