hashMap呼叫put方法的三種情形和原始碼
阿新 • • 發佈:2019-02-07
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)
來指定預設的長度和載入因子。