最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

Java重写equals()和hashCode()

来源:动视网 责编:小OO 时间:2025-09-29 04:16:27
文档

Java重写equals()和hashCode()

Java:重写equals()和hashCode()以下内容总结自《EffectiveJava》。1.何时需要重写equals()当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。2.设计equals()[1]使用instanceof操作符检查“实参是否为正确的类型”。[2]对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。[2.1]对于非float和double类型的原语类型域,使用==比较;[2.2]对于对象引用域,递归调用equals方法;[2.3]对于flo
推荐度:
导读Java:重写equals()和hashCode()以下内容总结自《EffectiveJava》。1.何时需要重写equals()当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。2.设计equals()[1]使用instanceof操作符检查“实参是否为正确的类型”。[2]对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。[2.1]对于非float和double类型的原语类型域,使用==比较;[2.2]对于对象引用域,递归调用equals方法;[2.3]对于flo
Java:重写equals()和hashCode()

以下内容总结自《Effective Java》。 

1.何时需要重写equals() 

当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。 

2.设计equals() 

[1]使用instanceof操作符检查“实参是否为正确的类型”。 

[2]对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。 

[2.1]对于非float和double类型的原语类型域,使用==比较; 

[2.2]对于对象引用域,递归调用equals方法; 

[2.3]对于float域,使用Float.floatToIntBits(afloat)转换为int,再使用==比较; 

[2.4]对于double域,使用Double.doubleToLongBits(adouble) 转换为int,再使用==比较; 

[2.5]对于数组域,调用Arrays.equals方法。 

3.当改写equals()的时候,总是要改写hashCode() 

根据一个类的equals方法(改写后),两个截然不同的实例有可能在逻辑上是相等的,但是,根据Object.hashCode方法,它们仅仅是两个对象。因此,违反了“相等的对象必须具有相等的散列码”。 

4.设计hashCode() 

[1]把某个非零常数值,例如17,保存在int变量result中; 

[2]对于对象中每一个关键域f(指equals方法中考虑的每一个域): 

[2.1]boolean型,计算(f ? 0 : 1); 

[2.2]byte,char,short型,计算(int); 

[2.3]long型,计算(int) (f ^ (f>>>32)); 

[2.4]float型,计算Float.floatToIntBits(afloat); 

[2.5]double型,计算Double.doubleToLongBits(adouble)得到一个long,再执行[2.3]; 

[2.6]对象引用,递归调用它的hashCode方法; 

[2.7]数组域,对其中每个元素调用它的hashCode方法。 

[3]将上面计算得到的散列码保存到int变量c,然后执行 result=37*result+c; 

[4]返回result。 

5.示例 

下面的这个类遵循上面的设计原则,重写了类的equals()和hashCode()。 

package com.zj.unit; 

import java.util.Arrays; 

  

public class Unit { 

    private short ashort; 

    private char achar; 

    private byte abyte; 

    private boolean abool; 

    private long along; 

    private float afloat; 

    private double adouble; 

    private Unit aObject; 

    private int[] ints; 

    private Unit[] units; 

  

    public boolean equals(Object o) { 

       if (!(o instanceof Unit)) 

           return false; 

       Unit unit = (Unit) o; 

       return unit.ashort == ashort 

              && unit.achar == achar 

              && unit.abyte == abyte 

              && unit.abool == abool 

              && unit.along == along 

              && Float.floatToIntBits(unit.afloat) == Float 

                     .floatToIntBits(afloat) 

              && Double.doubleToLongBits(unit.adouble) == Double 

                     .doubleToLongBits(adouble) 

              && unit.aObject.equals(aObject) 

&& equalsInts(unit.ints) 

              && equalsUnits(unit.units); 

    } 

  

    private boolean equalsInts(int[] aints) { 

       return Arrays.equals(ints, aints); 

    } 

  

    private boolean equalsUnits(Unit[] aUnits) { 

       return Arrays.equals(units, aUnits); 

    } 

  

    public int hashCode() { 

       int result = 17; 

       result = 37 * result + (int) ashort; 

       result = 37 * result + (int) achar; 

       result = 37 * result + (int) abyte; 

       result = 37 * result + (abool ? 0 : 1); 

       result = 37 * result + (int) (along ^ (along >>> 32)); 

       result = 37 * result + Float.floatToIntBits(afloat); 

       long tolong = Double.doubleToLongBits(adouble); 

       result = 37 * result + (int) (tolong ^ (tolong >>> 32)); 

       result = 37 * result + aObject.hashCode(); 

       result = 37 * result + intsHashCode(ints); 

       result = 37 * result + unitsHashCode(units); 

       return result; 

    } 

  

    private int intsHashCode(int[] aints) { 

       int result = 17; 

       for (int i = 0; i < aints.length; i++) 

           result = 37 * result + aints[i]; 

       return result; 

    } 

  

    private int unitsHashCode(Unit[] aUnits) { 

       int result = 17; 

       for (int i = 0; i < aUnits.length; i++) 

           result = 37 * result + aUnits[i].hashCode(); 

       return result; 

    } 

文档

Java重写equals()和hashCode()

Java:重写equals()和hashCode()以下内容总结自《EffectiveJava》。1.何时需要重写equals()当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念)。2.设计equals()[1]使用instanceof操作符检查“实参是否为正确的类型”。[2]对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值。[2.1]对于非float和double类型的原语类型域,使用==比较;[2.2]对于对象引用域,递归调用equals方法;[2.3]对于flo
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top