1. 把某个非零常数值,比如说17,保存在一个叫result的int类型的变量中。
2. 对于对象中每一个关键域f(指equals方法中考虑的每一个域),完成以下步骤:
4.写完了hashCode方法之后,问自己“是否相等的实例具有相等的散列码”。如果不是的话,找出原因,并修正错误。
例如
public int hashCode()
{
int result =17;
result=result*37 + width;
result=result*37 + height;
return result;
}
2. 对于对象中每一个关键域f(指equals方法中考虑的每一个域),完成以下步骤:
a. 为该域计算int类型的散列码c:
i. 如果该域是boolean类型,则计算(f ? 0 : 1) 。
ii. 如果该域是byte、char、short或者int类型,则计算(int) f。
iii. 如果该域是long类型,则计算(int) (f^(f>>>32))。
iv. 如果该域是float类型,则计算Float.floatToIntBits(f)。
ii. 如果该域是byte、char、short或者int类型,则计算(int) f。
iii. 如果该域是long类型,则计算(int) (f^(f>>>32))。
iv. 如果该域是float类型,则计算Float.floatToIntBits(f)。
v. 如果该域是double类型,则计算Double.doubleToLongBits(f)得到一个long类型的值,然后 按照步骤2.a .iii,对该long型值计算散列值。
vi.如果该域是一个对象引用,并且该类的equals方法通过递归调用equals的方式来比较这个域,则同样对这个域递归调用hashCode。如果要求一个更为复杂的比较,则为这个域计算一个“规范表示(canonical representation)”,然后针对这个范式表示调用hashCode。如果这个域的值为null,则返回0(或者其他某个常数,但习惯上使用0)。
vii. 如果该域是一个数组,则把每一个元素当做单独的域来处理。也就是说,递归地应用上述规则,对每个重要的元素计算一个散列码,然后根据步骤2.b中的做法把这些散列值组合起来。
b.按照下面的公式,把步骤a中计算得到的散列码c组合到result中:result =result*37+c
3.返回result。
4.写完了hashCode方法之后,问自己“是否相等的实例具有相等的散列码”。如果不是的话,找出原因,并修正错误。
例如
public int hashCode()
{
int result =17;
result=result*37 + width;
result=result*37 + height;
return result;
}