Java hashmap方法。put()

Java hashmap方法。put(),java,hash,hashmap,Java,Hash,Hashmap,java.util.HashMapputObject的源代码是 我认为如果键可以在表中获得相同的索引示例:key1和key2都在表[x]中,那么e.hash==hash将始终返回true。.put方法是否需要代码e.hash==hash 唯一的一种解释是,不同的key.hashCode在对hash和indexFor方法进行操作后,结果可能是相同的,因此代码是必要的 我的答案正确吗?谁能告诉我,如果e.hash==hash是必要的?e.hash==hash只是一种优化;这不是绝对必要的。您已经在比

java.util.HashMapputObject的源代码是

我认为如果键可以在表中获得相同的索引示例:key1和key2都在表[x]中,那么e.hash==hash将始终返回true。.put方法是否需要代码e.hash==hash

唯一的一种解释是,不同的key.hashCode在对hash和indexFor方法进行操作后,结果可能是相同的,因此代码是必要的


我的答案正确吗?谁能告诉我,如果e.hash==hash是必要的?

e.hash==hash只是一种优化;这不是绝对必要的。您已经在比较同一哈希桶中的元素,如果两个元素是.equals,则它们匹配。唯一的一点是最小化代价。等于检查哈希值与哈希表大小相同的元素。

不太清楚您的问题是什么。你能试着详细说明一下吗哈希可能发生?例如哈希!=哈希可能发生?当然,如果两个哈希值相同,则会改变哈希表的大小。
public V put(K key, V value) {

    if (key == null)
        return putForNullKey(value);
    int hash = hash(key.hashCode());
    int i = indexFor(hash, table.length);
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}