为什么java的HashMap会重新检查存储桶中的哈希码

Ser*_*kin 1 java hashmap

当HashMap搜索密钥时,它在2个位置使用密钥的哈希码:

  1. 选择桶
  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;
        }
    
    Run Code Online (Sandbox Code Playgroud)

为什么HashMap正在检查桶内的哈希码?为什么仅仅检查存储桶内的引用和对象是否足够?

Era*_*ran 5

比较哈希码(已经计算过,因此不需要hashCode()再次调用该方法),这是int比较,通常比调用便宜equals.

由于存储桶可能包含具有不同哈希码的密钥(例如,在HashMap16个桶中,哈希码1和17将映射到同一个桶),首先比较哈希码可以节省运行等于的需要(当哈希码时)不相等).

这类似于(k = e.key) == key在调用之前检查引用equality()的优化equals.