final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
? ? ? ? ? ? ? boolean evict) {
Node[] tab;
? ? Node p;
? ? int n, i;
? ? //此處會(huì)有線程安全。
? ? if ((tab =table) ==null || (n = tab.length) ==0) {
//如果數(shù)組為空,進(jìn)行數(shù)組初始化
? ? ? ? n = (tab = resize()).length;
? ? }
if ((p = tab[i = (n -1) & hash]) ==null) {
//通過位運(yùn)算,獲取i 的下標(biāo),判斷是否有元素,如果沒有重新創(chuàng)建一個(gè)。
? ? ? ? tab[i] = newNode(hash, key, value, null);
? ? }else {
Node e;
? ? ? ? K k;
? ? ? ? //如果值相等,進(jìn)行值得替換。
? ? ? ? if (p.hash == hash && ((k = p.key) == key || (key !=null && key.equals(k)))) {
e = p;
? ? ? ? }else if (pinstanceof TreeNode) {
//判斷節(jié)點(diǎn)的類型是不是樹,將元素插入到樹中。
? ? ? ? ? ? e = ((TreeNode) p).putTreeVal(this, tab, hash, key, value);
? ? ? ? }else {
//如果節(jié)點(diǎn)的類型是數(shù)組。(binCount 鏈表得長度。)
? ? ? ? ? ? for (int binCount =0; ; ++binCount) {
//如果鏈表最后一個(gè)元素等于空得時(shí)候進(jìn)行了尾插入。
? ? ? ? ? ? ? ? if ((e = p.next) ==null) {
//進(jìn)行尾插入。
? ? ? ? ? ? ? ? ? ? p.next = newNode(hash, key, value, null);
? ? ? ? ? ? ? ? ? ? //當(dāng)鏈表長度是8的時(shí)候進(jìn)行樹化。
? ? ? ? ? ? ? ? ? ? if (binCount >=TREEIFY_THRESHOLD -1) {
// -1 for 1st
? ? ? ? ? ? ? ? ? ? ? ? treeifyBin(tab, hash);
? ? ? ? ? ? ? ? ? ? }
break;
? ? ? ? ? ? ? ? }
if (e.hash == hash && ((k = e.key) == key || (key !=null && key.equals(k)))) {
break;
? ? ? ? ? ? ? ? }
p = e;
? ? ? ? ? ? }
}
if (e !=null) {
// existing mapping for key
? ? ? ? ? ? V oldValue = e.value;
? ? ? ? ? ? if (!onlyIfAbsent || oldValue ==null) {
e.value = value;
? ? ? ? ? ? }
afterNodeAccess(e);
? ? ? ? ? ? //將老的值return
? ? ? ? ? ? return oldValue;
? ? ? ? }
}
++modCount;
? ? //當(dāng)前數(shù)組元素的個(gè)數(shù)。
? ? if (++size >threshold) {
//進(jìn)行擴(kuò)容。
? ? ? ? resize();
? ? }
afterNodeInsertion(evict);
return null;
}