【发布时间】:2013-04-19 03:40:46
【问题描述】:
我知道这个问题已经被问过很多次了,但我找不到我的问题的确切答案。
在 Effective Java 的第 3 章中,有一个场景展示并解释了为什么哈希码应该与 equals 方法一起被覆盖。我了解了大部分内容,但其中有一部分我无法理解。
那里有一个给定的类,它覆盖了 equals 方法,但没有覆盖 hashCode 方法。对象作为键放在地图中
Map<PhoneNumber, String> m = new HashMap<PhoneNumber, String>();
m.put(new PhoneNumber(707, 867, 5309), "Jenny");
我知道如果我们 get 使用另一个相等对象 (m.get(new PhoneNumber(707, 867, 5309))),它将返回 null 仅仅是因为它们的哈希码不会被覆盖以返回相等对象的相等值(因为它会在另一个存储桶中搜索对象因为不同的哈希码)。
但根据我的理解,在那种情况下,不能保证两个对象的哈希码总是返回不同的。如果它们碰巧返回相同的哈希码怎么办?
我认为这部分解释了
即使两个实例碰巧哈希到同一个桶,get 方法几乎肯定会返回 null,因为 HashMap 有一个 缓存与每个条目关联的哈希码的优化和 如果哈希码不检查对象相等性,则不会打扰 匹配。
我只是没有得到缓存的东西。有人能详细解释一下吗?
另外,我已经做了功课,发现了一个相关的问题
但我对接受的答案并不满意,而且回答者在评论中说
哈希码可以是任意整数,因此每个哈希码不能有 自己的桶。因此,一些具有不同哈希码的对象 最终在同一个桶中。
我完全不同意。据我了解,不同的哈希码永远不会出现在同一个存储桶中。
【问题讨论】:
标签: java hashcode language-lawyer