面試必問系列——hashmap的默認擴容閾值是大於12還是大於等於12


  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就可以,但是對於大牛來說蒙混是不行滴,打鐵還要自身硬


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM