我知道这已被问过很多次,但我找不到我的问题的确切答案。
在 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 有一个优化,可以缓存与每个条目关联的散列码,并且如果散列码不检查对象相等性,则不会打扰不匹配。
我只是没有得到缓存的东西。有人可以详细解释一下吗?
另外,我已经完成了我的家庭作业,并找到了一个相关的问题
将与每个条目关联的哈希码缓存到其 get 方法的 HashMap 优化的影响
但是我对接受的答案并不满意,而且,回答者在评论中说
哈希码可以是任意整数,因此每个哈希码不能有自己的桶。因此,一些具有不同哈希码的对象最终会在同一个桶中。
我完全不同意。据我了解,不同的哈希码永远不会出现在同一个存储桶中。