Java hashmap方法.put()

时间:2014-09-04 15:50:44

标签: java hash hashmap

java.util.HashMap#put(Object, Object)的源代码是

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

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

唯一的解释是在hash()indexFor()方法操作之后的不同key.hashCode(),结果可能是相同的,因此代码将是必要的。< / p>

我的回答是对的吗?谁能告诉我,是否有必要e.hash == hash

1 个答案:

答案 0 :(得分:0)

e.hash == hash只是一种优化;它不是绝对必要的。您已经在比较同一个哈希桶中的元素,如果两个元素是.equals,那么它们就匹配了。唯一的一点是尽量减少对散列与散列表大小相同的元素的昂贵.equals检查。