为什么重写 equals 时必须重写 hashCode 方法?

在阅读hashCode()与 equals()时,了解到:

把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals() 方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。

如果两个对象相等,则 hashcode 一定也是相同的。两个对象相等,对两个对象分别调用 equals 方法都返回 true。但是,两个对象有相同的 hashcode 值,它们也不一定是相等的 。因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖。

我的理解:计算哈希值时可能会产生哈希碰撞,如果碰撞的两个对象恰巧时 equals 的,HashSet 就会忽略加入第二个对象,违背了真实意图。所以需要重写 hashcode 方法,使得 equals 的两个对象的哈希值不同。

重写 hashcode 方法参见如何重写hashCode算法

posted @ 2021-03-28 14:28  徐斐然  阅读(127)  评论(0)    收藏  举报