为什么重写equals时必须重写hashCode方法?

         感觉网上很多博客要么抄,要么有的写的很晦涩难懂,所以按照自己的理解写了一份。

           (1)两个对象相等,hashcode一定相等

          (2)两个对象不等,hashcode不一定不等

          (3)hashcode相等,两个对象不一定相等

          (4)hashcode不等,两个对象一定不等

一句话总结:两个对象在equals逻辑上是认为相同的,没重写hashcode方法导致hash值不同。按照规则1 :相同的对象应该是有相同的hash值的。     

详解原因: 

 假如有个自定义对象,重写equals方法在逻辑上来判断对象是否相等.

        如:对象内部有个name变量,通过比较name是否相等来判断对象是否相等。

        如果将该对象用于hashmap等集合类中作为key,假如两个对象,通过判断name是否相等来重写euqals方法,我们设置两个对象name为相同值,也就是说这两个对象逻辑上是相等的。

        在逻辑上我们想使用这两个对象的name成员变量作为关键字插入到hashmap中。如果没有重写hashcode方法,那么将会使用object的hashcode方法,那么导致的结果就是两个不同对象equals判断是相等的,但是通过object hashcode生成的hash值可能是不等的,key(hash值)不同这就造成插入到hashmap中两个逻辑上相同对象,但是在map中存到了hash表中不同数组结点的链表中,也就是存在两份逻辑上相同的对象。

结果:在逻辑上我们认为这两个对象是相同对象,但是在map中因为key值(hash值)不同,认为这两个是不同的对象。按照关键字key唯一性的特点,不应该存在两个相同的key(对象)。

补充:

object hashcode方法:

  • java6、7默认是返回随机数
  • java8默认是通过和当前线程有关的一个随机数+三个确定值,运用Marsaglia’s xorshift scheme随机数算法得到的一个随机数

参考:

https://blog.csdn.net/changrj6/article/details/100043822

https://www.jianshu.com/p/75d9c2c3d0c1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值