作者:勇敢的刺鸟宝贝4164053383 | 来源:互联网 | 2023-01-09 11:46
当HashMap搜索密钥时,它在2个位置使用密钥的哈希码:
选择桶
在bucket中查找条目(openjdk7 HashMap get方法源码)
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正在检查桶内的哈希码?为什么仅仅检查存储桶内的引用和对象是否足够?
1> Eran..:
比较哈希码(已经计算过,因此不需要hashCode()
再次调用该方法),这是int
比较,通常比调用便宜equals
.
由于存储桶可能包含具有不同哈希码的密钥(例如,在HashMap
16个桶中,哈希码1和17将映射到同一个桶),首先比较哈希码可以节省运行等于的需要(当哈希码时)不相等).
这类似于(k = e.key) == key
在调用之前检查引用equality()的优化equals
.