快速业务通道

Java:重写equals()和hashCode() - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21

Java:重写equals()和hashCode()

时间:2011-01-06 zhangjunhd

以下内容总结自《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。

Java:重写equals()和hashCode()(2)

时间:2011-01-06 zhangjunhd

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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号