effectiveJava(7)覆盖equals时总要覆盖hashcode

在每个覆盖了equals方法的类中,也必须要覆盖hashcode方法。如果不这样做的话,就会违反Object.hashcode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap、

HashSet、Hashtable.

  Object规范:

  在应用程序的执行期间,只要对象的equals方法的比较操作所作用到的信息没有被修改,那么对这同一对象调用多次,hashCode方法都必须返回同一个整数。在同一个应用程序的多次执行过程中,每次执行返回的整数可以不一致。

  如果两个对象根据equals方法比较是相等的,那么调用这两个对象中任意一个对象的hashcode方法必须产生同样的结果

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

原文地址:https://www.cnblogs.com/dgq-blog/p/9035531.html

时间: 2024-10-09 22:26:47

effectiveJava(7)覆盖equals时总要覆盖hashcode的相关文章

覆盖equals时总要覆盖hashCode

本文涉及到的概念 1.为什么重载equals方法时,要重载hashCode函数;没有重载hashCode带来的问题 2.一个对象hashCode的生成规则 1.为什么重载equals方法时,要重载hashCode函数 “ 一个很常见的错误根源在于没有覆盖hashCode方法.在每个覆盖了equals方法的类中,也必须覆盖hashCode方法.如果不这样做,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap,HashS

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

在每个覆盖equals方法的类中,也必须覆盖hashCode方法.否则,会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,包括HashMap,HashSet,Hashtbale. hashCode约定内容: 1.只要对象equals方法的比较操作所用到的信息没有被修改,对同一对象调用多次,hashCode方法都必须返回同一整数.在同一应用程序的多次执行过程中,每次执行返回的整数可以不一致. 2.如果两个对象根据equals(Object)方法比较

覆盖equals()时总要覆盖hashCode()

覆写如下: 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

【Effective Java】5、覆盖equals时总要覆盖hashcode

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时请遵守通用约定——Effective Java 读书笔记

如果满足了以下任一条件,这就正是所期望的结果: 类的每个实例本质上都是唯一的. 不关心类是否提供了"逻辑相等"的测试功能. 超类已经覆盖了equals,从超类继承过来的行为对于子类也是适合的. 类是私有的或是包级私有的,可以确定它的equals方法永远不会被调用. 如果类具有自己特有的"罗吉相等"概念(不同于对象等同的概念),而且超类还,没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法. equals方法实现了等价关系: 自反性 对称性 传递

【Java实战】源码解析为什么覆盖equals方法时总要覆盖hashCode方法

1.背景知识 本文代码基于jdk1.8分析,<Java编程思想>中有如下描述: 另外再看下Object.java对hashCode()方法的说明: /** * Returns a hash code value for the object. This method is * supported for the benefit of hash tables such as those provided by * {@link java.util.HashMap}. * <p> *

第八条:覆盖equals时请遵守通用约定

==是物理相等 equals是逻辑相等 因为每个类的实例对象本质上都是唯一的 ,利用物理相等(==)是指一个实例只能相等于它自己. 利用逻辑相等是(equals)指 一个实例是否和另一个实例的某些关键域相等,从而来判断这两实例是否相等. Object类的equals方法的实现:物理相等的话就逻辑相等. 什么时候不需要覆盖Object类的equals方法? 1.希望这个类的实例只能和自身相等,不覆盖equals方法,只继承Object类的equals方法. 我们比较这个类的实例对象是否相等,无论是

第三章:对于所有对象都通用的方法。ITEM8:覆盖equals时请遵守通用约定。

1.什么时候需要覆盖equals?如果类具有自己特有的“逻辑相等”概念,而且超类还没有覆盖equals. 2.覆盖equals时需要遵守的约定: 自反性.对于任何非null的引用值x,x.equals(x)必须返回true. 对称性.对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true. 1 package com.twoslow.cha3; 2 3 /** 4 * 对称性 5 */ 6 public class CaseInse

24、覆盖equals时请遵守通用约定

覆盖equals方法看似很简单,但是有许多覆盖方式会导致错误,并且后果非常严重.最容易的避免这类问题的方法就是不覆盖equals方法,这种情况下,每个实例都与它自身相等. 如果你必须覆盖equals方法,那么请遵循: 1.自反性.对于任何非null的引用值x,x.equals(x)必须返回true: 2.对称性.对于任何非null的引用值x和y,当且进党y.equalts(x)返回true时,x.equals(y)必须返回true: 3.传递性.对于任何非null的引用值x和y和z,如果x.eq