前言
HashMap有兩個版本需要甄別,分別是JDK1.8和JDK1.7
JDK1.8版本的HashMap

在JDK1.8版本的HashMap中,鏈表元素叫做Node

- 判斷當前桶是否為空,空的就需要初始化(resize 中會判斷是否進行初始化), 根據當前 key 的 hashcode
- 定位到具體的桶中并判斷是否為空,為空表明沒有 Hash 沖突就直接在當前位置創建一個新桶即可, 如果當前桶有值( Hash
沖突),那么就要比較當前桶中的 key、key 的 hashcode 與寫入的 key 是否相等,相等就賦值給 e,在第 8
步的時候會統一進行賦值及回傳, 如果當前桶為紅黑樹,那就要按照紅黑樹的方式寫入資料, 如果是個鏈表,就需要將當前的 key、value
封裝成一個新節點寫入到當前桶的后面(形成鏈表), 接著判斷當前鏈表的大小是否大于預設的閾值,大于時就要轉換為紅黑樹,
如果在遍歷程序中找到 key 相同時直接退出遍歷, 如果 e != null 就相當于存在相同的 key,那就需要將值覆寫,
最后判斷是否需要進行擴容,
紅黑樹

JDK1.7版本的HashMap
HashMap是陣列+鏈表,通俗點講就是陣列里放鏈表,鏈表中放的是Key-Value,鏈表元素叫做Entry.

HashMap有負載因子0.75和初始容量16,同時有對應的閾值16*0.75=12,
在put元素時,按照哈希碼&(陣列元素-1),計算應該放到哪個鏈表里,
當size大于閾值時會將陣列擴容,擴容到原來的兩倍,將舊陣列里的元素全部重新計算下標放到新陣列中,
在JDK1.7中,插入結點使用頭插法,在1.8后,將頭插法改成了尾插法,
參考
https://my.oschina.net/crossoverjie/blog/1861138
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/132278.html
標籤:其他
上一篇:蘇云兒小姐姐的博客
