putval()方法
//hash:key的hash值
//key:原始key
//value:要存放的值
//onlylfabsent:如果true代表不更改現有的值
//evict:如果為false表示table為建立狀態
final v putval(int hash, k key, v value, boolean onlyifabsent,
boolean evict)
//條件成立的話,說明找到了相同key的node元素,需要進行替換操作
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
//當雜湊衝突,且key不同時,相當於,在鍊錶最後加了乙個節點,此處,相當於將p向下移動到原來e的位置,然後返回上層邏輯,(e = p.next) == null成立,插入新節點
//說明新新增的元素和當前節點不相等,繼續查詢下乙個節點。用於遍歷桶中的鍊錶,與前面的e = p.next組合, 可以遍歷鍊錶
p = e;}}
//e不等於null,條件成立,說明,找到了乙個與你插入元素key完全一致的資料,需要進行替換
v oldvalue = e.value;
if (!onlyifabsent || oldvalue == null)
e.value = value;
afternodeaccess(e);
return oldvalue;}}
//modcount:表示雜湊表結構被修改的次數,替換node元素的value不計數
++modcount;
//插入新元素,size自增,如果自增厚的值大於擴容閾值,則觸發擴容
if (++size > threshold)
resize();
afternodeinsertion(evict);
return null;
}
複習HashMap原始碼增刪改查
hashmap 對key的hash運算 static final int hash object key 通過對key的異或運算 將高位與低位進行互換,從而減低了hash衝突,進而降低了系統損耗。public v put k key,v value 1.首先判斷hashmap是否經過初始化,如果沒有...
JDK原始碼之HashMap
部分重要屬性 存放key,value的陣列 transient node table 存放entry的set transient set entryset hashmap的大小 預設16 transient int size 修改次數 transient int modcount 擴擴容閾值capa...
原始碼分析之HashMap
首先hashmap繼承了abstractmap,並且實現了map cloneable和serializable三個介面。cloneable和serializable是比較常規的兩個介面,在這裡並不作為重點。重點將會放在abstractmap和map兩個規範上。其中abstractmap是乙個抽象類,...