hashmap的默認擴容閾值是大於12還是大於等於12?沒錯我們初學者看源碼,一看就知道是16*0.75=12,所以12是一個擴容閾值的關鍵字,但是翻看各種博文,有說大於12的,有說等於12的,所以今天樓主雄起了,給大家總結一下,此外順便說明一下其他容易搞混的問題,比如鏈表轉紅黑樹的閾值是大於8還是等於8
面試官摳着腳進來了
面試官:看過JDK源碼吧,說說hashmap的初始化長度是多少呢?
我:easy,16
面試官:哦,那我new HashMap()之后,馬上就是16嗎?
我:是的
面試官:出門右拐,開窗戶自由落體下去
我:嘿嘿,面試官我是逗你的,真正創建一個16長度的數組是在第一次put的時候,做一次判斷,如果長度為0或者為null的話,就做一次擴容,數組也是在這個時候初始化的
面試官:你這么優秀,快趕上我的腳指頭了
我(內心):我有這么臭嗎
面試官:說到擴容,你講一下擴容的源碼吧
我:巴拉巴拉小魔仙
面試官:等一下,你剛才說數組長度大於等於12就會擴容?
我:額,(內心:你都反問了,應該就是說錯了),不是不是,是大於12的時候,也就是說擴容是發生在第13次put的時候
面試官:算你機靈,那你說說引入紅黑樹后,鏈表轉換為紅黑樹的閾值是多少,是大於8還是等於8,另外,紅黑樹會退化為鏈表嗎?會的話閾值是多少,說清楚是大於還是大於等於
此時面試官已經用鼻孔看你了,必須要拿出真本事,不能再含糊不清的蒙混了
我:當鏈表長度大於8時轉換為紅黑樹,小於6時退化為鏈表,中間數是為了過度使用,防止鏈表與紅黑樹之間頻繁的轉換,造成效率低下
面試官:鏈表的初始長度為什么要設為16,17不信嗎?
我:這個問題很玄學,但是根據hashmsp的源碼注釋來看,作者指明了選取16是根據泊松分布取的
總結:hashmap的初始容量是16,在第一次put的時候進行的擴容初始化,鏈表長度大於8時才會轉換為紅黑樹,紅黑樹長度小於6時會退化為鏈表,擴容因子是0.75,初始化擴容閾值為大於12。這些問題有時候面試官也不清楚,我遇到過,你只要說出來關鍵字16,12,8,6就可以,但是對於大牛來說蒙混是不行滴,打鐵還要自身硬