將integer.max_value賦給閾值,返回舊表;
這個比較有意思,涉及到hashmap的幾種初始化,深入說一下。
(1)如果使用public hashmap()初始化表,oldcap為0,oldthr也為0,會走到下乙個分支(第4點);
(2)如果使用public hashmap(int initialcapacity)初始化,會進一步呼叫public hashmap(int initialcapacity, float loadfactor),該構造方法將threshold賦值為大於等於initialcapacity的2的冪,也就出現了第3點的分支(oldcap只跟表有關係,與initialcapacity無關)。
(3)如果落在這個分支,newcap獲得了threshold,在跳出分支之後還有單獨的**對threshold賦值,賦值為newcap*loadfactor。
jdk1.7之前的擴容操作,如果涉及到多執行緒可能會出現鍊錶迴圈的問題,原因是1.7版本採用遍歷+頭插的方法進行rehash,1.8則直接連線在兩個子鍊錶的末尾,也就避免了這個問題。
HashMap中的resize問題
在jdk1.8中,hashmap的resize 函式做了相應的調整,尤其是對於在buckets的鍊錶中,官方給出的該resize 函式主要在兩種情況下使用 初始化的時候 將雜湊表擴容成之前的兩倍時 下面首先看初始化時,實際的resize 函式做了哪些工作 final node resize node...
HashMap的擴容機制 resize
hashmap底層邏輯 當我們往hashmap中put元素的時候,先根據key的hash值得到這個元素在陣列中的位置 即下標 然後就可以把這個元素放到對應的位置中了。如果這個元素所在的位子上已經存放有其他元素了,那麼在同乙個位子上的元素將以鍊錶的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。從ha...
HashMap的resize 即擴容方法原始碼分析
直接上 final node resize elseif newcap oldcap 1 maximum capacity oldcap default initial capacity 若舊陣列容量小於最大容量且新陣列容量擴大至舊陣列容量的2倍後依舊小於最大容量,並且舊陣列容量大於等於預設的初始化...