覆盖equals时总要覆盖hashCode

覆盖equals时总要覆盖hashCode

基于散列的集合例如HashSet,HashMap在判断是否是同一个对象的时候是先判断他们的hashCode是否相等,如果相等再判断equals是否相等,都相等两个对象才相等,而如果hashCode不相等就说明两个对象不相等,没有必要比较equals了。
下面是来自Object的规范:
1.在应用程序的执行期间,只要对象的equals 方法的比较操作所用到的信息没有被修改,那么对同一个对象的多次调用, hashCode 方法都必须始终返回同一个值。在一个应用程序与另一个程序的执行过程中,执行hashCode 方法所返回的值可以不一致。
2.如果两个对象根据equals(Object )方法比较是相等的,那么调用这两个对象中的hashCode 方法都必须产生同样的整数结果。
3.如果两个对象根据equals(Object )方法比较是不相等的,那么调用这两个对象中的hashCode 方法,则不一定要求hashCode 方法必产生不同的结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列表( hashtable )的性能。
上面的三点看起来有点儿绕,核心思想就是
1.环境和equals比较的值不变的情况下,hashCode的值始终不变
2.equals相等,hashCode必然相等
3.hashCode相等,equals可以不相等。
所以如果重写了equals而没有重写hashCode就可能会导致上面中的2不符合,即equals相等,hashCode可能不等。这种情况出现非常严重,比如判断一个集合里面包含某一个对象,首先判断这个对象的hashCode在集合中有没有相同的hashCode,结果判断没有,导致判断结果是在集合中没有这个对象,但是这个对象equals比较的时候和集合中的某个对象是相等的。
所以结论就是覆盖equals时总要覆盖hashCode,否则在散列集合中会发生错误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值