为什么我不能只比较两个对象的 hashCode 以确定它们是否相等?

Why can't I just compare the hashCode of two objects in order to find out if they are equal or not?

为什么Eclipse实现的equals方法要比较每个值,只比较两个对象的hashCode不是更简单吗?

据我所知:

编辑:相关问题,为什么在实现 equals 时总是实现 hashCode,如果 equals 实际上不需要 hashCode?

hashCode always generates the same hash for the same input

正确。

So if two objects are equal, they should have the same hash

正确。

If objects that are equal have the same hash, I can just check the hash in order to determine of objects are equal or not

不合逻辑。 不相等的对象也可以具有相同的哈希码。这就是哈希码的目的。

Related question, why does one always implement the hashCode when equals is implemented, if the hashCode isn't actually needed for equals?

因为需要散列,在HashMap, HashSet,和朋友。如果您认为您的对象永远不会被如此使用,请不要覆盖它,祝您好运。

为了补充 ,这里有一个完全有效但无用的 .hashCode() 实现:

@Override
public int hashCode()
{
    return 42; // The Answer
}

用非常简单的术语来说:虽然每只松鼠都是动物,但并非每只动物都是松鼠。 hashCode 通常用于快速查找 - 它应该是高效的并且它应该在查找中均匀分布数据 table - 参见 here。但是散列函数会产生冲突,这就是为什么它不应该用作验证对象相等性的手段的原因。

这在很大程度上取决于 hashCode 的实现——您也可以在 fge 的回答中看到。

至于为什么在覆盖 equals 时通常需要重新实现:它们都用于在集合中存储和检索对象(例如 HashMap)。 hashCode 确定对象将被插入地图中的位置,而 equals 用于标识碰撞桶内的对象。