直接上**
final node
resize()
elseif(
(newcap = oldcap <<1)
< maximum_capacity &&
oldcap >= default_initial_capacity)
//若舊陣列容量小於最大容量且新陣列容量擴大至舊陣列容量的2倍後依舊小於最大容量,
//並且舊陣列容量大於等於預設的初始化容量16
newthr = oldthr <<1;
// double threshold //則將新陣列閾值擴大至舊陣列擴容閾值的2倍
}else
if(oldthr >0)
// initial capacity was placed in threshold
//若舊陣列容量小於等於0,且舊陣列擴容閾值大於0(當new hashmap(0)後再put操作時,會執行到這裡)
newcap = oldthr;
//則將舊陣列閾值賦給新陣列容量
else
if(newthr ==0)
threshold = newthr;
//將新陣列擴容閾值賦值給hashmap的擴容閾值字段
@suppresswarnings()
node
newtab =
(node
)new
node
[newcap]
;//按照新陣列容量建立新陣列
table = newtab;
//將建立的新陣列賦值給hashmap的陣列字段
if(oldtab != null)
else
}while
((e = next)
!= null)
;//鍊錶後續還有節點時,才繼續處理,否則跳出迴圈
if(lotail != null)
if(hitail != null)}}
}}return newtab;
//返回處理完的新陣列
}
HashMap中的resize問題
在jdk1.8中,hashmap的resize 函式做了相應的調整,尤其是對於在buckets的鍊錶中,官方給出的該resize 函式主要在兩種情況下使用 初始化的時候 將雜湊表擴容成之前的兩倍時 下面首先看初始化時,實際的resize 函式做了哪些工作 final node resize node...
HashMap的擴容機制 resize
hashmap底層邏輯 當我們往hashmap中put元素的時候,先根據key的hash值得到這個元素在陣列中的位置 即下標 然後就可以把這個元素放到對應的位置中了。如果這個元素所在的位子上已經存放有其他元素了,那麼在同乙個位子上的元素將以鍊錶的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。從ha...
HashMap的resize 過程簡述版本
將integer.max value賦給閾值,返回舊表 這個比較有意思,涉及到hashmap的幾種初始化,深入說一下。1 如果使用public hashmap 初始化表,oldcap為0,oldthr也為0,會走到下乙個分支 第4點 2 如果使用public hashmap int initialc...