当HashMap搜索密钥时,它在2个地方使用密钥的哈希码:
选择桶
在存储桶(openjdk7 HashMap get method source)中查找条目
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
为什么HashMap在存储桶中检查哈希码?为什么仅检查存储桶中的引用和对象相等性还不够?
最佳答案
比较哈希码(已经计算过,因此无需再次调用hashCode()
方法)(即int
比较)通常比调用equals
便宜。
由于存储桶可能包含具有不同哈希码的键(例如,在具有16个存储桶的HashMap
中,哈希码1和17将映射到相同的存储桶),因此先比较哈希码可以节省运行等于的需求(当哈希码不相等)。
这类似于在调用(k = e.key) == key
之前检查引用相等性(equals
)的优化。
关于java - 为什么Java的HashMap重新检查存储桶中的哈希码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47247306/