HashMap的put方法
1.7將新元素插在鏈表的頭部
public V put(K key, V value)
// 若 哈希表未初始化(即 table爲空) 。 則使用構造函數時設置的閾值(即初始容量) 初始化數組table
if (table == EMPTY_TABLE) {
inflateTable(threshold);
}
//判斷key是否爲空值null,若key == null,則將該鍵-值存放到數組table 中的第1個位置,即table [0]
if (key == null)
return putForNullKey(value);
// 若 key ≠ null,則計算存放數組 table 中的位置(下標、索引)
// a. 根據鍵值key計算hash值
int hash = hash(key);
// b. 根據hash值 最終獲得 key對應存放的數組Table中位置
int i = indexFor(hash, table.length);
// 判斷該key對應的值是否已存在(通過遍歷 以該數組元素爲頭結點的鏈表 逐個判斷),如果該對應數據已存在,執行覆蓋操作。用新value替換舊value,並返回舊value
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++; //保證併發訪問時,若HashMap內部結構發生變化,快速響應失敗
//若 該key不存在,則將“key-value”添加到table中
addEntry(hash, key, value, i);
return null;
}
爲什麼HashMap中的數組大小必須是2的冪次
1-24.56
位操作比取餘操作速度塊