当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正在检查桶内的哈希码?为什么仅仅检查存储桶内的引用和对象是否足够?
答案 0 :(得分:5)
比较哈希码(已经计算过,因此无需再次调用hashCode()
方法),这是int
比较,通常比调用equals
便宜。
由于存储桶可能包含具有不同哈希码的密钥(例如,在带有16个桶的HashMap
中,哈希码1和17将映射到同一个桶),因此首先比较哈希码可以节省需求运行equals(当哈希码彼此不相等时)。
这类似于在调用(k = e.key) == key
之前检查引用相等性(equals
)的优化。