java对象覆盖equals时总要覆盖hashcode

     2022-03-24     208

关键词:

  在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。

 

  hashCode的通用约定:

  1 在程序的执行过程中,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数。

  2 如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。

  3 如果两个对象根据equals(Object)方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生不同的整数结果。给不相等的对象产生不同的整数结果,可以提高散列表的性能。

  因没有覆盖hashCode而违反的关键约定是第2条:相等的对象必须具有相等的散列码(hash code)。由于类没有覆盖hashCode方法,两个相等的实例调用hashCode方法返回的整数可能不相等。

  

  一个好的散列函数为不相等的对象产生不相等的散列码。理想情况下,散列函数应该把集合中不相等的实例均匀地分布到所有可能的散列值上。31可用移位和减法来代替乘法,可以得到更好的性能:31*i==(i<<5)-i。

 

  参考资料

  《Effective Java 中文版 第2版》 第9条:覆盖equals时总要覆盖hashCode P39-43

java:effectivejava学习笔记之覆盖equals时总要覆盖hashcode(代码片段)

...时总要覆盖hashcode1.什么是hashcode方法?2.hashcode相等与对象相等之间的关系:(保证设计是规范的前提下)3.为什么要覆盖hashcode3.1、覆盖equals时总要覆盖hashCode3.2、如何在覆盖equals方法时覆盖hashcode方法?参考... 查看详情

覆盖equals时总要覆盖hashcode

...时,要重载hashCode函数;没有重载hashCode带来的问题2.一个对象hashCode的生成规则   1.为什么重载equals方法时,要重载hashCode函数“一个很常见的错误根源在于没有覆盖hashCode方法。在每个覆盖了equals方法的类中,也必... 查看详情

第9条:覆盖equals时总要覆盖hashcode

...包括HashMap,HashSet,Hashtbale。 hashCode约定内容:1.只要对象equals方法的比较操作所用到的信息没有被修改,对同一对象调用多次,hashCode方法都必须返回同一整数。在同一应用程 查看详情

effectivejava5覆盖equals时总要覆盖hashcode

packagecn.xf.cp.ch02.item9;importjava.util.HashMap;importjava.util.Map;publicclassPhoneNumber{privatefinalshortareaCode;privatefinalshortprefix;privatefinalshortlineNumber;publicPhoneNumber(intareaCod 查看详情

java实战源码解析为什么覆盖equals方法时总要覆盖hashcode方法(代码片段)

1、背景知识本文代码基于jdk1.8分析,《Java编程思想》中有如下描述:另外再看下Object.java对hashCode()方法的说明:/***Returnsahashcodevaluefortheobject.Thismethodis*supportedforthebenefitofhashtablessuchasthoseprovidedby*& 查看详情

java实战源码解析为什么覆盖equals方法时总要覆盖hashcode方法(代码片段)

1、背景知识本文代码基于jdk1.8分析,《Java编程思想》中有如下描述:另外再看下Object.java对hashCode()方法的说明:/***Returnsahashcodevaluefortheobject.Thismethodis*supportedforthebenefitofhashtablessuchasthoseprovidedby*& 查看详情

effectivejava第九条:覆盖equals时总要覆盖hashcode(代码片段)

先来看一个例子:PhoneNumer类publicclassPhoneNumberprivatefinalintareaCode;privatefinalintprefix;privatefinalintlineNumber;publicPhoneNumber(intareaCode,intprefix,intlineNumber)rangeCheck(areaCode,999,&# 查看详情

effectivejava目录

创建和销毁对象考虑用静态工厂方法代替构造器遇到多个构造器参数时要考虑用构建器用私有构造器或者枚举类型强化Singleton属性通过私有构造器强化不可实例化能力避免创建不必要的对象消除过期的对象引用避免使用终结方法... 查看详情

java对象覆盖equals时请遵守通用约定

...sp;  如果类具有自己特有的“逻辑相等”概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为 查看详情

仅使用一个变量覆盖 HashCode() 的正确方法是啥?

】仅使用一个变量覆盖HashCode()的正确方法是啥?【英文标题】:WhatisthecorrectwaytooverrideHashCode()usingonlyonevariable?仅使用一个变量覆盖HashCode()的正确方法是什么?【发布时间】:2022-01-1416:32:20【问题描述】:我目前正在尝试学习如... 查看详情

java:effectivejava学习笔记之覆盖equals时请遵守通用约定(代码片段)

...通用约定1、为什么要覆盖equals因为默认equals在比较两个对象时,是看他们是否指向同一个地址。但有时,我们需要两个不同对象只要是某些属性相同就认为它们equals()的结果为true。比如:classPersonStringname;pu... 查看详情

覆盖 Java 中的 hashCode() 和 equals() 方法

...,我只是不知道用另一种方式来总结我的问题。我有一个对象Label,它包含多个组件,其中一个是List,它包含多个 查看详情

在 Java 中覆盖 equals 和 hashCode 时应该考虑哪些问题?

...【参考方案1】:如果您正在处理使用诸如Hibernate之类的对象关系映射器(ORM)持 查看详情

equals()和hashcode()必须同时覆盖的原因

...化的集合的正常工作。其中有一条约定很重要:如果两个对象利用equals方法比较是相等的,那么这两个对象必须能返回同样的hashCode。这一点很好理解,就比如拿S 查看详情

intellijidea中怎么覆盖tostring(),hashcode(),equals()?

...实现特殊的功能。实现equal()方法:1、该方法用于比较该对象是否和目标对象相同,在Object类中,这个方法将判断两个对象是否具有相同的引用(等价于用“==”比较两个对象),有时我们需要判断两个对象的状态来决定他们是... 查看详情

为啥我需要覆盖 Java 中的 equals 和 hashCode 方法?

】为啥我需要覆盖Java中的equals和hashCode方法?【英文标题】:WhydoIneedtooverridetheequalsandhashCodemethodsinJava?为什么我需要覆盖Java中的equals和hashCode方法?【发布时间】:2022-01-0303:47:55【问题描述】:最近我通读了这个DeveloperWorksDocumen... 查看详情

为啥我需要覆盖 Java 中的 equals 和 hashCode 方法?

】为啥我需要覆盖Java中的equals和hashCode方法?【英文标题】:WhydoIneedtooverridetheequalsandhashCodemethodsinJava?为什么我需要覆盖Java中的equals和hashCode方法?【发布时间】:2019-01-2205:47:01【问题描述】:最近我通读了这个DeveloperWorksDocumen... 查看详情

在java中覆盖equal方法的正确方法是啥?

】在java中覆盖equal方法的正确方法是啥?【英文标题】:What\'sthecorrectwaytooverrideequalmethodinjava?在java中覆盖equal方法的正确方法是什么?【发布时间】:2015-05-0623:09:09【问题描述】:publicclassPersonprivateStringname;publicPerson(Stringname)this... 查看详情