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

时间:2017-11-12 09:36:18

标签: java hashmap

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

  1. 选择水桶
  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;
        }
    
  3. 为什么HashMap正在检查桶内的哈希码?为什么仅仅检查存储桶内的引用和对象是否足够?

1 个答案:

答案 0 :(得分:5)

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

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

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