HahMap(jdk=1.8)源碼解讀

簡介:歲月磨平了人的稜角,讓我們不敢輕易的去放手,即使它在你心中並不那麼重要,你依舊害怕失去它,不是捨不得,是內心的迷茫。                

一 : 創建HashMap

  HashMap<Object, Object> hashMap = new HashMap<>();

 

源碼1

解讀:初始化this.loadFactor(0.75),改值做為一個負載因子,當負載比數大於它時,就會擴容一倍數組容量( >>1)

二:插入新值到HashMap中

hashMap.put(1, 1);
hashMap.put(2, 1);

源碼2:

 

解讀:僅計算了key的hash值,然後傳遞給下面代碼

 解讀:

步驟1.第一個IF判斷賦值後判斷table是否為null –> true {初始化table(resize)和賦值n}

步驟2.第二個IF(通過數組長度和key的hash值的位運算與&,計算key所在的數組索引->賦值並判斷改位置是否位null)?–>true{若為null,說明key不存在,新建node節點並賦值改數組位置}

步驟3.承接2的第二個IF == false,即該位置存在數據節點p。第三個IF(通過短路與(&&)判斷p的hash值和p的key值和參數key是否相等)–>true{說明key已經存在,並賦值e位該節點}

步驟4.承接3的第三個IF == false, 即該節點P的key不是不參數key。else if (判斷該節點P是否位樹節點) –>true{是樹節點,把新值插入樹節點,並返回值賦值給e}

步驟5.承接4的else if  == false,即該節點是鏈表節點。然後for迭代鏈表節點然後判斷,第一個IF(判斷該節點的下一個節點是否位null)?–>true{新建節點值並賦值給節點} ,緊跟第二個IF(判斷迭代的次數是否大於(8-1)即8次)?–>true{說明該鏈表長度大於8,然後鏈錶轉換為紅黑樹},然後迭代結束。第三個IF,承接第一個IF即該節點不為null,然後步驟3判斷一樣

步驟6.IF判斷e是否不為null?–>true{舊值返回,並退出}

步驟7.承接第二步的 IF == true,說明在數組的新的位置插入了新數據,然後IF判斷(數組的填充數是否大於數組的長度乘以負載因子)?–>true{擴容數組}

步驟8.空的方法

三:獲取HashMap中的值

hashMap.get(1);

 

 解讀:計算key的hash值,並把hash值和key傳入getNode方法

 

 解讀:

步驟1.第一個IF(利用短路與(&&)判斷table是否為null和table的長度和位運算與(&)找出hash值對應的數組索引並賦值first判斷是否位null)

步驟2.承接步驟1 if==true,IF(判斷key是否相等)?–>true{返回該節點}

步驟3.承接步驟2 IF == false,第一個IF(賦值並判斷為 null),第二個IF(判斷該節點是否位樹節點)?–>true{通過樹查找並返回退出},第三個IF 在do{}while內,承接第二個IF==false,即鏈表節點,查找並返回退出

步驟4.返回null,即查找的值不存在