重写hashCode

散列函数应该尽可能的把不行等的实例均匀的分布到所有可能的散列值上。

对于对象中某个关键域f(指equals方法涉及到的每个域),完成以下步骤

把某个非0的常数,比如说17 保持在int 类型的变量中
a.为该域计算int类型的散列码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),然后按照步骤3 ,为得到的long类型计算散列值
  6. 如果该域是一个对象引用,并且该类的equals方法通过递归调用equals的方式来比较这个域,则同样为这个域递归的调用hashCode。如果需要更复杂的比较,则为这个域计算一个范式,然后针对这个范式调用hashCode。如果这个域为null则返回0(或者其它某个常数,但通常是0)
  7. 如果该域是一个数组,则要把每一个元素当作单独的域来处理。也就是说,递归的调用上述规则,对每个重要的元素计算散列码,然后根据步骤b的做法把这些散列吗组合起来。如果数组中的每个元素都很重要,可以利用发行版本1.5中增加的其中一个Arrays.hashCode

b. 按照下面的公式,把步骤1中计算得到的散列码c合并到result中
result = 31 * result +c

参考文献:effective Java 第二版 41 页。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值