当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/

10-12 05:47