HashMap底层存储原理

2021-05-21  本文已影响0人  邓立_全栈UncleLi

概念

不同JVM版本HashMap的展现形式

存储的优点

HashMap存储元素的过程

HashMap取值的实现

扩容

HashMap中的扩容是在元素插入之前进行的扩容还是元素插入之后进行的扩容

存储元素超过阈值一定会进行扩容吗

HashMap和HashTable区别

HashMap中的hashcode怎么生成

为什么使用HashCode

equals方法和hashcode的关系

归纳总结:

key为null怎么办

/**
 * HashMap的put方法
 */
public V put(K key, V value) {
    if (table == EMPTY_TABLE) {
        inflateTable(threshold);
    }
    
    // key为null调用putForNullKey(value)
    if (key == null) return putForNullKey(value);
    
    int hash = hash(key);
    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;
}

/**
 * Offloaded version of put for null keys
 */
private V putForNullKey(V value) {
    // for循环处理key为空的情况
    for (Entry<K,V> e = table[0]; e != null; e = e.next) {
        if (e.key == null) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }
    modCount++;
    addEntry(0, null, value, 0);
    return null;
}
上一篇 下一篇

猜你喜欢

热点阅读