Java:重写equals和hashCode

来源:互联网 发布:软件项目管理实践 编辑:程序博客网 时间:2024/04/30 01:44

 1. 当一个类有自己特有的“逻辑相等”概念时,我们需要重写equals.按照以下原则来重写:

  • 使用instanceof操作符检查“实参是否为正确的类型”。
  • 对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域。
  • 对于非float和double类型的原语类型域,使用==比较
  • 对于对象应用域,递归调用equals方法。
  • 对于float域,使用Float.floatToIntBits(afloat)转换为int,再使用==比较。
  • 对于double域,使用Double.doubleToLongBits(adouble)转换为int,再使用==比较。
  • 对于数组域,调用Arrays.equals方法。

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

3.设计hashCode()原则:

⑴.把某个非零常数值,例如17,保存在int变量result中。

⑵.对于对象中每一个关键域f(指equals方法中考虑的每一个域)

①.boolean型,计算(f?0:1)。

②.byte,char,short型,计算(int)。

③.long型,计算(int)(f^(f>>>32));

④.float型,计算Float.floatToIntBits(afloat);

⑤.double型,计算Double.doubleToLongBits(adouble)得到一个long,再执行上面一步;

⑥.对象引用,递归调动它的hashCode方法

⑶.将上面计算得到的散列码保存到int变量C,然后执行result=37*result+C;

⑷.返回result


0 0