HashMap中有很多常量數(shù)字,如默認初始大小(DEFAULT_INITIAL_CAPACITY)=,最大容量
(MAXIMUM_CAPACITY)=,默認加載因子
(DEFAULT_LOAD_FACTOR)=,鏈表轉(zhuǎn)換紅黑樹的閥值
(TREEIFY_THRESHOLD)=,這些常量是根據(jù)什么定義的呢?
默認初始大小(16)
這個初始的大小是1 << 4,也就是,首先這個初始大小是2的倍數(shù),因為當length是2的倍數(shù)的時候
index = h % length可以優(yōu)化成 h & (length-1),&效率高于%,其次是2的倍數(shù)為什么不是4,8,32而是16呢,如果太小的話擴容頻繁,太大的話占用內(nèi)存空間
最大容量
Map中bucket的長度限制是,這里不是說只能放
個key-value鍵值對,因為HashMap是數(shù)組加鏈表結(jié)構(gòu),這個的bucket是數(shù)組的長度,理論上Map的數(shù)據(jù)量取決于機器內(nèi)存的大小
默認加載因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;
這個默認加載因子的取值是空間跟時間的折中,源碼中有注釋:
As a general rule, the default load factor (.75) offers a good tradeoff between time and space costs.
當加載因子是0.75的時候,初始大小16的情況下,存放16*0.75=12個元素的時候需要擴容成32,如果這個加載因子太小則會頻繁擴容,反之太大的話需要全部放滿才擴容容易產(chǎn)生hash碰撞
鏈表轉(zhuǎn)換紅黑樹的閥值
這個值8的話跟加載因子一樣,也是一個概率問題