【发布时间】:2011-10-21 17:47:52
【问题描述】:
相等的对象必须具有相等的哈希码。根据我的理解,当我们打算在基于散列的数据结构中使用对象时,此声明是有效的。这是 java 文档中 hashcode 和 equals 方法的合同之一。我探索了这句话的原因并查看了implementation of hashtable,并在put方法中找到了下面的代码
if ((e.hash == hash) && e.key.equals(key))
所以我明白了,合同来自上述条件e.hash == hash。我进一步尝试探索为什么 java 在比较两个对象是否相等时检查哈希码。所以这是我的理解
如果两个相等的对象具有相等的hascode,那么它们可以存储在同一个桶中,这对于仅在单个桶中查找来说会很好
检查 hashcode 比实际调用 equals 方法要好,因为 hascode 方法比 equals 方法成本低,因为这里我们只需要比较 int 值,而在 equals 方法中可能涉及对象字段比较。所以 hashcode 方法提供了一个额外的过滤器。
如果以上两个原因都成立,请纠正我?
【问题讨论】:
-
我不认为
.equals()用于比较哈希码或对象引用。 -
当您使用不可变对象并且只计算一次哈希码时,这是一个很好的方法。哦,别忘了 HashTable 已被弃用。
标签: java collections hashcode