步骤
- 设想一个非零数字result,比如17
- 对每一个field f:
若为boolean, 则计算(f?1:0)
若为byte, char, short, int,计算(int)f
若为long, 计算(f^(f>>>32))
若为float, 计算Float.floatToIntBits(f)
若为double, 计算Double.doubleTooIntBits(f)
若为一个对象引用,则递归调用f的hashcode()方法,若该引用为null,返回0
若为一个数组,则将其中每个元素当作分离的元素处理
- 将上一步计算求和为c
- 计算result = 31*result+c (31 为 参考值)
- 编写单元测试来检验是否合理,并修正常量
要点
- 任何在equals()方法中出现的field都应该纳入hashCode()的计算
- 为何第四步选用31? 31是一个奇素数,在处理溢出时性能较好。并且JVM对于31这样的数的乘法可以处理成移位运算和减法运算(31 = 2^5-1),效率较高。
- 为了提高性能而减少在hashCode()计算中涉及的field往往得不偿失。
posted @
2018-02-08 10:45
我也想学编程
阅读(
255)
评论()
编辑
收藏
举报