基础补充

hashcode 修改的使用时机:

      在每改写equals方法,就要改写hashcode方法。如果不改写的话,会导致该类无法与所有基于散列值(hash)的集合类结合在一起正常工作,这样的集合包括hashMap,hashSet和hashtable.

      如果我们定义的类不会和java集合类产生关系,那么我们完全没有必要在重写equals()方法的时候来重写hashcode()方法。但出于规范,还是最好用ide直接生成。

编写hashcode的方法:

     

  1. 把某个非零常数值(如17)保存在一个叫result的int类型的变量中;
  2. 对于对象中每个关键字域f(指equals方法中考虑的每一个域),完成以下步骤:
    1. 为该域计算int类型的散列码c:
      1. 如果该域是bloolean类型,则计算(f?0:1)
      2. 如果该域是byte,char,short或int类型,则计算(int)f
      3. 如果该域是long类型,则计算(int)(f^(>>>32))
      4. 如果该域是float类型,则计算Float.floatToIntBits(f)
      5. 如果该域是double类型,则计算Double.doubleToLongBits(f)得一long类型值,然后按前述计算此long类型的散列值
      6. 如果该域是一个对象引用,则利用此对象的hashCode,如果域的值为null,则返回0
      7. 如果该域是一个数组,则对每一个数组元素当作单独的域来处理,然后安下一步的方案来进行合成


    2. 利用下面的公式将散列码c 组合到result中。

              result=37*result+c;

 

hashMap 与  hashtable:判断key是否相同的条件都是hashcode()相同&&满足equals() 。

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值