hashmap中實際是維護了乙個node陣列,用來儲存資料,下面看一下node原始碼:
staticclass nodeimplements map.entry
簡單介紹一下node中的屬性:
1:hash值
2:key-鍵
3:value-值
分析一波add()原始碼,上**:
//hash值和元素的hashcode()方法相關
final v putval(int hash, k key, v value, boolean
onlyifabsent,
boolean
evict)
//如果hash值相同,equals也返回true,則表示為相同物件,直接e = p.next覆蓋
//如果hash值相同,equals不同,則判定為不一樣的物件,則追加新節點到尾部
if (e.hash == hash &&((k = e.key) == key || (key != null &&key.equals(k))))
break
;
//迴圈替換迭代
p =e;}}
//如果e不是null,說明有需要覆蓋的節點
if (e != null)
}++modcount;
//如果新增乙個元素後,大小超過了 容量 * 負載因子,則需要擴容
if (++size >threshold)
resize();
//空方法,沒實現
afternodeinsertion(evict);
return
null
; }
HashMap中add 方法的原始碼學習
hashmap add hash值和元素的hashcode 方法相關 final v putval int hash,k key,v value,boolean onlyifabsent,boolean evict 如果找到了要覆蓋的節點 if e.hash hash k e.key key key...
HashMap的resize 即擴容方法原始碼分析
直接上 final node resize elseif newcap oldcap 1 maximum capacity oldcap default initial capacity 若舊陣列容量小於最大容量且新陣列容量擴大至舊陣列容量的2倍後依舊小於最大容量,並且舊陣列容量大於等於預設的初始化...
HashMap 的 get 方法的流程分析(原始碼)
流程首先根據 hash 方法獲取到 key 的 hash 值 然後通過 hash length 1 的方式獲取到 key 所對應的node陣列下標 length對應陣列長度 首先判斷此結點是否為空,是否就是要找的值,是則返回空,否則進入第二個結點。接著判斷第二個結點是否為空,是則返回空,不是則判斷此...