HashMap的resize 即擴容方法原始碼分析

2021-10-08 18:11:46 字數 1050 閱讀 9880

直接上**

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...