HashMap中有很多常量數(shù)字,如默認初始大小(DEFAULT_INITIAL_CAPACITY)=
盒让,最大容量(MAXIMUM_CAPACITY)=
,默認加載因子(DEFAULT_LOAD_FACTOR)=
司蔬,鏈表轉換紅黑樹的閥值(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呢浮梢,如果太小的話擴容頻繁,太大的話占用內存空間
最大容量
Map中bucket的長度限制是彤路,這里不是說只能放個key-value鍵值對秕硝,因為HashMap是數(shù)組加鏈表結構,這個的bucket是數(shù)組的長度洲尊,理論上Map的數(shù)據(jù)量取決于機器內存的大小
默認加載因子
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碰撞
鏈表轉換紅黑樹的閥值
這個值8的話跟加載因子一樣丽涩,也是一個概率問題