hashCode 和 equals方法

 

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 比较。

 

 

posted @ 2024-05-22 20:42  学Java的`Bei  阅读(14)  评论(0编辑  收藏  举报