Item 9 覆盖equals时总要覆盖hashCode】的更多相关文章

为什么覆盖equals时,总要覆盖hashCode?   原因是,根据Object规范: 如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果. 如果违反这个规定,那么,在使用应用了散列码的集合(HashMap,HashSet,Hashtable)时,就会出现问题.   也就是,两个相等的对象,必须要有相等的散列码(hashCode).两个对象,进行比较的时候,使用的关键域是一样的,然后,使用这些关键域作为参…
本文涉及到的概念 1.为什么重载equals方法时,要重载hashCode函数;没有重载hashCode带来的问题 2.一个对象hashCode的生成规则       1.为什么重载equals方法时,要重载hashCode函数 “ 一个很常见的错误根源在于没有覆盖hashCode方法.在每个覆盖了equals方法的类中,也必须覆盖hashCode方法.如果不这样做,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap…
在每个覆盖equals方法的类中,也必须覆盖hashCode方法.否则,会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,包括HashMap,HashSet,Hashtbale. hashCode约定内容: 1.只要对象equals方法的比较操作所用到的信息没有被修改,对同一对象调用多次,hashCode方法都必须返回同一整数.在同一应用程序的多次执行过程中,每次执行返回的整数可以不一致. 2.如果两个对象根据equals(Object)方法比较…
本文参考 本篇文章参考自<Effective Java>第三版第十一条"Always override hashCode when you override equals" You must override hashCode in every class that overrides equals hashCode()方法的通用约定如下: When the hashCode method is invoked on an object repeatedly during…
2019独角兽企业重金招聘Python工程师标准>>> 1.在每个覆盖了equals 方法的类中,也必须覆盖hashCode 这是关于hashCode 的通用约定 这样可以与 基于散列的集合一起工作,比如:HashMap.HashSet.HashTable 2.Object 规范: 在应用程序执行期间,equals 比较的信息不变,对同一对象多次调用,hashCode 返回同一整数 在同一应用程序的多次执行中,hashCode 返回整数可以不一致 两个对象equals 比较相等,hash…
覆写如下: public class User{ private Integer id; private String userName; private String passWord; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserName() { return userName; } public void setUserN…
package cn.xf.cp.ch02.item9; import java.util.HashMap; import java.util.Map; public class PhoneNumber { private final short areaCode; private final short prefix; private final short lineNumber; public PhoneNumber(int areaCode, int prefix, int lineNum…
覆盖equals是总要覆盖hashCode 通过散列函数将集合中不相等的实例均匀的分布在所有可能的散列值上 1.把某个非零的常数值保存在一个名为result的int类型变量中 2.对于对象中每个关键域f(指equals方法中涉及的每个域),完成以下步骤: a.为该域计算int类型的散列码c i.boolean – f?1:0; ii.byte char short int – int(f); iii.long – int(f^f>>>32); iv.Float – Float.float…
在覆盖equals方法的时候,你必须要遵守它的通用约定,不遵守,写出来的方法,会出现逻辑错误.下面是约定的内容:   equals方法实现了等价关系:   自反性.对于任何非null的引用值,x.equals(x)必须返回true. 对称性.对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true. 传递性.对于任何非null的引用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.…
如果不需要覆盖equals方法,那么就无需担心覆盖equals方法导致的错误. 什么时候不需要覆盖equals方法? 1.类的每个实例本质上是唯一的. 例如对于Thread,Object提供的equals实现正好符合. 2.不关心类是否提供了“逻辑相等”的测试功能. 例如Random类提供产生随机数的能力,如果覆盖equals,目的该是检查两个Random实例是否产生了相同的随机数列,但实际上这个比较功能是不需要的,所以从Object继承的equals是足够的. 3.超类已经覆盖了euqlas,…