当前位置:   article > 正文

hashCode_chashcode

chashcode
一、
把某个非零的常数值,比如17,保存在一个名为result的int变量中。
二、
a、为该域计算int类型的hashCode的值c:
1)如果该域是boolean,则计算(f ? 1 : 0);
2)如果该域是byte、char、short或者int,则计算(int)f;
3)如果该域是long,则计算(int)(f ^ f >>> 32);
4)如果该域是float,则计算Float.floatToIntBits(f);
5)如果该域是double,则计算Double.doubleToLongBits(f)先得到long,然后根据long的计算规则算出int;
6)如果该域是引用对象,且该类的equals方法通过递归地调用equals方法来比较这个域,则同样为这个域递归地调用hashCode。如果需要更复杂的比较,则为这个域计算一个“范式(canonical representaion)”,然后针对这个范式调用hashCode。如果这个域的值为null,则返回0(或者其他常数,但通常是0);
7)如果该域是一个数组,则要把其中的每个元素当作单独的域来处理。也就是说,递归地应用上述规则,对每个重要的元素计算其hashCode,然后按照result = 31 * result + c的做法把这些hashCode组合起来。如果数组域中的每个元素都很重要,可以利用jdk1.5中的Arrays.hashCode方法。
b、按照result = 31 * result + c的做法把二.a中所得的结果合并到result中
三、
返回result。
四、

问问自己“相等的实例是否都具有相等的hashCode”。测试,纠错。


为什么用31?
因为它是一个奇素数。如果乘以偶数,且乘法溢出的话,信息就会丢失,因为与2相乘等价于以为运算。使用素数的好处并不明显,但习惯上都使用素数。31有个好特性:31 = 32 - 1,所以对于一个int值a,31 可以做到a * 31 = a << 5 - a。现代的VM可以自动完成这种优化。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/325169
推荐阅读
相关标签
  

闽ICP备14008679号