equals() 和 hashcode() 的关系和同步重写的原因

1. 二者的关系:

Java 存储对象时,生成了一张 Hash 表,保存了 对象的 哈希值和地址的对应关系。

保存每一个对象 都需要 使用 hashcode() 和 equal() 这两个方法。

hashcode() 的返回值:获取 对象链表存储的位置(最底下一排数组),获取对象存储所在的链表;

equals():  在获取到的链表中,查找是否有该对象,没有则将该对象插入链表, 有则不存储/覆盖;

哈希表大概长这个样子:

2. 同步重写的原因:

官方文档要求:

如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode() 方法都必须生成相同的整数结果。 
以下情况无强制要求:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode() 方法必定会生成不同的整数结果。

(1)即 equals() 判断相等的对象,其生成的 hashcode 必须相同;

(2)equals() 判断不等的对象,其生成的 hashcode 可以相同,也可以不同;

 

当前 Java 代码中的 equals() 和 hashcode() 方法达到了上述要求,

如果修改 equals(), 不修改 hashcode() 方法, 就可能违背 (1):equals() 相等, 但是 hashcode() 返回值不同。

二者必须同时修改。

 

3. Java 如此规定的可能原因:

为了保证相同的对象存储在相同的位置。

如果相同的对象存储在不同的位置,数据就会混乱,查找对象也会混乱。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值