为什么Eclipse实现的equals方法比较每个值,不比较两个对象的hashCodes更简单吗?
据我所知:
编辑:相关问题,为什么在实现equals时总是实现hashCode,如果hashCode实际上不需要等于?
答案 0 :(得分:4)
hashCode始终为同一输入生成相同的哈希
正确。
因此,如果两个对象相等,则它们应该具有相同的散列
正确。
如果相等的对象具有相同的散列,我可以检查散列以确定对象是否相等
非sequitur。不相等的对象也可以具有相同的哈希码。这就是哈希码的目的。
相关问题,为什么在实现equals时总是实现hashCode,如果hashCode实际上不需要等于?
因为在HashMap, HashSet,
和朋友中需要哈希。如果您认为您的对象永远不会被如此使用,请不要覆盖它,并祝你好运。
答案 1 :(得分:1)
为了补充@EJP's answer,这是.hashCode()
的完全有效但无用的实现:
@Override
public int hashCode()
{
return 42; // The Answer
}
答案 2 :(得分:0)
用非常简单的术语来说:虽然每只松鼠都是动物,但并不是每只动物都是松鼠。 hashCode通常用于快速查找 - 它应该是高效的,它应该在查找表中统一分配数据 - 请参阅here。但是哈希函数可以产生冲突,这就是为什么它不应该被用作验证对象相等性的手段。
这一切都非常依赖于hashCode的实现 - 你也可以在fge的答案中看到。
为什么在重写equals时通常需要重新实现它们:它们在存储和从集合中检索对象时使用(例如HashMap)。 hashCode确定映射中将插入对象的位置,而equals用于标识冲突桶内的对象。