相等对象必须具有相等的哈希码。根据我的理解,当我们打算在基于散列的数据结构中使用对象时,此声明是有效的。这是 java 文档中 hashcode 和 equals 方法的契约(Contract)之一。我探究了为什么这样说并查看了 implementation of hashtable并在 put
方法
if ((e.hash == hash) && e.key.equals(key))
所以我明白了,合约来自上面的条件 e.hash == hash
。我进一步尝试探索为什么 java 在比较两个对象是否相等时检查哈希码。所以这是我的理解
如果两个相等的对象具有相同的 hascode,那么它们可以存储在同一个桶中,这对于仅在单个桶中查找而言会很好
最好检查 hashcode 然后实际调用 equals 方法,因为 hascode 方法比 equals 方法成本更低,因为这里我们只需要比较 int 值,而 equals 方法可能涉及对象字段比较。因此哈希码方法提供了一个额外的过滤器。
如果以上两个理由都成立,请指正?
最佳答案
- 正确,只是一个小的更正 - 如果两个不相等对象具有相同的哈希码。
- 不完全是,最好先检查它,作为不相等的过滤器,但如果你想确保对象相等,你应该调用
equals()
关于java - 相等的对象必须具有相等的哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6971542/