为什么java的HashMap会重新检查bucket中的hashcode

为什么java的HashMap会重新检查bucket中的hashcode,java,hashmap,Java,Hashmap,当HashMap搜索key时,它在两个位置使用key的hashcode: 挑桶 在桶内找到入口 为什么HashMap要检查bucket中的hashcode?为什么仅仅检查bucket中的引用和对象是否相等还不够?比较已经计算的哈希代码,因此无需再次调用hashCode方法,即int比较,通常比调用equals便宜 由于一个bucket可能包含具有不同哈希代码的键,例如,在具有16个bucket的HashMap中,哈希代码1和17将映射到同一个bucket,因此首先比较哈希代码可以避免在哈希代码彼

当HashMap搜索key时,它在两个位置使用key的hashcode:

挑桶 在桶内找到入口


为什么HashMap要检查bucket中的hashcode?为什么仅仅检查bucket中的引用和对象是否相等还不够?

比较已经计算的哈希代码,因此无需再次调用hashCode方法,即int比较,通常比调用equals便宜

由于一个bucket可能包含具有不同哈希代码的键,例如,在具有16个bucket的HashMap中,哈希代码1和17将映射到同一个bucket,因此首先比较哈希代码可以避免在哈希代码彼此不相等时运行equals


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

比较已经计算的哈希代码,因此无需再次调用hashCode方法,即int比较,通常比调用equals便宜

由于一个bucket可能包含具有不同哈希代码的键,例如,在具有16个bucket的HashMap中,哈希代码1和17将映射到同一个bucket,因此首先比较哈希代码可以避免在哈希代码彼此不相等时运行equals


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

它检查的是key的hashCode,而不是bucket的hashCode。它节省了相等性测试的时间。因为一个bucket包含具有不同哈希的键,所以比较哈希比比较键更快。它检查的是键的哈希代码,而不是bucket的哈希代码。由于bucket包含具有不同哈希值的键,因此比较哈希值比比较键更快。

    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;
    }