为什么我不能只比较两个对象的 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不是更简单吗?
据我所知:
- 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 用于标识碰撞桶内的对象。
为什么Eclipse实现的equals方法要比较每个值,只比较两个对象的hashCode不是更简单吗?
据我所知:
- 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 用于标识碰撞桶内的对象。