讲下 equals 和 hashcode,他们为何必须一起重写?hashcode 方法重写规则?

目录

目录

1、equals 和 hashCode(哈希码) 是什么?

  1. 两个都是 Object 类的方法
  2. 源码中:equals 是通过比较两个对象的地址值
  3. 源码中:hashCode 是通过将内存地址转换成 Int 值来比较
  4. 使用环境:equals 方法是比较两个对象的内容,hashcode 方法只可能会在集合中用到

2、equals 和 hashCode 的作用和关系是什么?

  • equals 和 hashCode 都是用于比较对象是否相等
  • 两者相互依赖但又不相互信任。重写 equals 的实现比较全面且复杂,效率比较低。用hashCode 来比较的话,效率就很高,但并不完全可靠。

3、如果都不重写会怎样?

  • 会直接调用 Object 类中的 equals() ,通过对比对象地址来比较
  • Object 中是将内存地址进行对比,所以相同的类,new 出两个对象也是不同的,hashCode 也是不同的,所以不符合我们的要求
  • 如果遇见去重,比较数据的话,就会出现异常情况

4、只重写 equals 会怎样呢?

  • 如果需要大量并快速对比对象的话,equals 效率太低了。
  • 这种容器一般为:hashset、hashmap、hashtable等,如:hashset 要求对象不能重复,内部肯定会对每个对象进行比较,所以根据对比规则,如果 hashCode 相同,在用 equals 验证,如果 hashCode 不同,则不同,这样就提高了效率

5、只重写 hashCode 会怎样呢?

  • 只重写 hashCode 是不可靠,有时候两个对象生成的 hashCode 可能会一样,会出现异常情况。
  • equal() 相等的两个对象他们的 hashCode() 肯定相等,也就是用 equal() 对比是绝对可靠的
  • hashCode() 相等的两个对象他们的 equal() 不一定相等,也就是 hashCode() 不是绝对可靠的

6、hashCode 重写规则是什么?

  • 两个对象相等,hashCode 一定相等
  • 两个对象不等,hashCode 不一定不等
  • hashCode 相等,两个对象不一定相等
  • hashCode 不等,两个对象一定不等

最后我觉得我可能只是回答了字面上的意思,可能并没有触及到 hash 原理,如有大佬可以告知,非常感谢!

参考文章:https://www.cnblogs.com/keyi/p/7119825.html 其中包含了 示例参考

仅供自己学习参考,如有错误的地方,请大家指出!一起学习

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值