1. 程式人生 > >hashMap呼叫put方法的三種情形和原始碼

hashMap呼叫put方法的三種情形和原始碼

public V put(K key, V value) {  
    // 處理key為null,HashMap允許key和value為null  
    if (key == null)  
        return putForNullKey(value);  
    // 得到key的雜湊碼  
    int hash = hash(key);  
    // 通過雜湊碼計算出bucketIndex  
    int i = indexFor(hash, table.length);  
    // 取出bucketIndex位置上的元素,並迴圈單鏈表,判斷key是否已存在  
    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;  
        }  
    }  
  
    // key不存在時,加入新元素  
    modCount++;  
    addEntry(hash, key, value, i);  
    return null;  
}  

haspMap 初始容量為16 載入因子預設為0.75

因此預設情況下hashMap會在put第十三個元素的時候呼叫rehash。

可以使用

HashMap(int initialCapacity, float loadFactor)

來指定預設的長度和載入因子。