【发布时间】:2015-04-18 16:43:09
【问题描述】:
为什么Eclipse实现的equals方法会比较每个值,只比较两个对象的hashCode不是更简单吗?
据我所知:
- hashCode 总是为相同的输入生成相同的哈希
- 因此,如果两个对象相等,则它们应该具有相同的哈希
- 如果相等的对象具有相同的哈希,我可以检查哈希以确定对象是否相等
编辑:相关问题,如果equals实际上不需要hashCode,为什么在实现equals时总是实现hashCode?p>
【问题讨论】:
为什么Eclipse实现的equals方法会比较每个值,只比较两个对象的hashCode不是更简单吗?
据我所知:
编辑:相关问题,如果equals实际上不需要hashCode,为什么在实现equals时总是实现hashCode?p>
【问题讨论】:
hashCode 总是为相同的输入生成相同的哈希
正确。
所以如果两个对象相等,它们应该有相同的哈希
正确。
如果相等的对象具有相同的哈希,我可以检查哈希以确定对象是否相等
Non sequitur. 不相等的对象也可以具有相同的哈希码。这就是哈希码的目的。
相关问题,如果equals实际上不需要hashCode,为什么在实现equals时总是实现hashCode?p>
因为在HashMap, HashSet, 和朋友中需要它来进行散列。如果您认为您的对象永远不会被如此使用,请不要覆盖它,祝您好运。
【讨论】:
作为对@EJP's answer 的补充,这里是.hashCode() 的一个完全有效但无用的实现:
@Override
public int hashCode()
{
return 42; // The Answer
}
【讨论】:
简单地说:虽然每只松鼠都是动物,但并非每只动物都是松鼠。 hashCode 通常用于快速查找 - 它应该是高效的,并且应该在查找表中均匀分布数据 - 请参阅here。但是哈希函数会产生冲突,这就是为什么它不应该用作验证对象相等性的方法。
这一切都非常依赖于 hashCode 的实现——你也可以在 fge 的回答中看到。
至于为什么在覆盖 equals 时通常需要重新实现:它们都用于从集合中存储和检索对象(例如 HashMap)。 hashCode 确定对象在地图中的插入位置,而 equals 用于标识碰撞桶内的对象。
【讨论】: