1. 为什么重写 equals 方法时需要重写 hashCode 方法?
在 Java 中,equals 和 hashCode 方法的合同(contract)规定:
(1) 如果两个对象根据 equals 方法是相等的,那么它们的 hashCode 值必须相同。
(2) 如果两个对象根据 equals 方法是不相等的,那么它们的 hashCode 值不一定不同。
这是因为哈希表(如 HashMap 和 HashSet)使用 hashCode 来确定对象的存储位置。如果只重写 equals 而不重写 hashCode,可能会违反这个合同,导致集合在存储和查找对象时出现问题。
- 哈希存储: 当将对象添加到 HashSet 或 HashMap 中时,集合会首先计算对象的 hashCode 值,以确定其存储的桶(bucket)。
- 冲突处理: 如果两个对象的 hashCode 值相同,集合会使用 equals 方法来确定它们是否确实是相同的对象。
2. hashCode 和 equals方法联系。
(1) 如果两个对象通过 equals 方法比较是相等的,那么它们的 hashCode 值一定相等。
-
- 这是 Java 的 hashCode 合同要求的。这保证了在哈希表中相等的对象会被放在同一个桶中。
(2) 如果两个对象的 hashCode 值相等,它们不一定是通过 equals 方法比较相等。
-
- 因为不同的对象可以有相同的 hashCode 值(哈希碰撞)。
(3) 如果两个对象通过 equals 方法比较是不相等的,它们的 hashCode 值可能相等。
-
- 这是由于哈希碰撞,即不同的对象可能有相同的 hashCode 值。
(4) 如果两个对象的 hashCode 值不相等,它们一定通过 equals 方法比较是不相等的。
-
- 如果 hashCode 不相等,equals 一定不会认为它们相等。这是因为 hashCode 是先验条件,只有 hashCode 相等时才有可能进一步通过 equals 比较。
标签:相等,对象,equals,hashCode,哈希,方法 From: https://www.cnblogs.com/warmNest-llb/p/18207053