您的位置:首页 > 编程语言 > Java开发

java中hashcode的计算方法

2014-02-26 10:12 891 查看
1. 把某个非零常数值,比如说17,保存在一个叫result的int类型的变量中。

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)。

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: