談一下hashMap中put是如何實現的?


源碼:

Hash(key):計算出key的hash值。

put方法詳解:

1、如果table數組為null或者table數組的長度為0,則調用resize()方法擴容並返回table數組。數組的長度為n,(put時確保table數組不為空且長度不為0)

2、如果table數組不為null且數組的長度不為0,則根據table數組的長度n和key的hash值hash(key),計算出數組下標i,該下標對應的節點名稱為p,此時p節點為頭節點

如果p節點為null,則根據hash值、key、value新建一個node節點,直接插入。(如果下標位置節點為空,則新建一個節點放在該下標位置)

其中hash值時key的hashCode()方法算出來的值h的低16位異或高16位算出來的結果,

3、如果table數組不為null且數組的長度不為0,下標i位置的節點p也不為null

1)、如果p節點的hash值等於hash(key)且p節點的key等於key,將p節點賦值給e節點,即hash值和key均相同時,新的節點覆蓋原來的節點,此時e節點不為空。

(如果下標位置有節點,節點的hash值與hash(key)相等且key也相等,則將該下標位置的節點賦值給e節點,此時e節點的value值為舊值。后面再將新添加的value覆蓋e節點的value)

2)、如果p節點為紅黑樹節點,則進行紅黑樹處理,此時e節點不為空

3)、如果p節點的hash值等於hash(key)但是key不相等且p節點不為紅黑樹節點,即p節點為鏈表節點,如果p的下一個節點為空

則根據hash值、key、value新建一個節點作為p節點的下一個節點,即直接插入,此時e節點不為空,且e節點為新添加的節點。

如果鏈表長度超出8時,則執行紅黑樹邏輯。

如果p的下一個節點e不為空且e節點的hash值等於hash(key)但是key不相等,則將e賦值給p節點,指向下一個尋找的節點。如果key相等,后面再用新添加的value覆蓋e節點的value

4、如果e節點不為空且e節點的value值不為空,則將新添加的value覆蓋e節點的value

簡述如下:如果table數組為null或者table數組的長度為0,則調用resize()方法擴容並返回table數組,數組的長度為n;根據table數組的長度n和key的hash值hash(key),計算出數組下標i,如果如果下標處頭節點為null,則根據hash值、key、value新建一個node節點,直接插入。如果頭節點不為null且為紅黑樹節點,則進行紅黑樹處理;如果頭節點不為null且頭節點的hash值相等且key也相等,則用新的節點覆蓋舊的節點;如果頭節點的hash值相等但是key不相等且頭節點的下一個節點為空時,則根據hash值、key、value新建一個節點作為p節點的下一個節點,即直接插入。如果頭節點的下一個節點不為空且hash值相等且key相等時,則用新的節點覆蓋舊的節點;如果頭節點的下一個節點不為空且hash值相等但key不相等時,指向下一個尋找的節點

put 方法執行邏輯的圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM