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 如此规定的可能原因:
为了保证相同的对象存储在相同的位置。
如果相同的对象存储在不同的位置,数据就会混乱,查找对象也会混乱。