看懂了jdk7hashmap的擴容頭插法,及其可能產生的迴圈引用問題,今天看看jdk8的hashmap擴容實現。採取的是用四個結點,兩條鍊錶完成重新分配位置,比較簡單有趣。解析如下:
//如果原來的table等於null,直接返回
if (oldtab != null) else
} while ((e = next) != null);
//while迴圈完之後,大概會形成兩個鍊錶【高位鏈hihead--hitail,低位鏈lohead--lotail】,最極端的情況是只有高位鏈或
//只有低位鏈。拿著這兩個鍊錶,插入到對應桶位,入駐新家。
//判斷低位鏈中是否有元素
if (lotail != null)
//判斷高位鏈中是否有元素
if (hitail != null) }}
}}
JDK8 HashMap原始碼解析 resize方法
一 概述 hashmap的resize方法的作用 在向hashmap裡put元素的時候,hashmap基於擴容規則發現需要擴容的時候會呼叫該方法來進行擴容。二 方法解析 final node resize 如果陣列元素個數在正常範圍內,那麼新的陣列容量為老的陣列容量的2倍 左移1位相當於乘以2 如果...
JDK8 HashMap原始碼解析 put方法
一 概述 map的put方法接受兩個引數,key和value,該方法用於儲存鍵值對。hashmap的put方法只有一行 return putval hash key key,value,false,true 參見 hash方法解析hash方法解析可知put方法是乙個方便使用者使用的快捷方式,具體邏輯...
JDK 1 8 HashMap擴容原理
擴容前計算索引 1010 0101 0000 1111 0000 0101 索引結果 5擴容以後容量是n 32 對應的二進位制是0001 1111 node本身的hash值是不變的,仍然是1010 0101,那麼擴容後node 的索引的計算是通過如下方式得到 擴容後計算索引 1010 0101 00...