從HashMap面試聊聊網際網路內卷

SnailsCoffee發表於2021-02-25

微信公眾號:大黃奔跑
關注我,可瞭解更多有趣的面試相關問題。

寫在之前

毫無疑問,回想2020年有什麼詞出現在眼前最多的,無疑是"996"和"內卷",從馬老師的福報論、到年底pdd剛畢業員工猝死,內卷從此從最初談論於學者文章中出圈了,之後一發不可收拾,幾乎能貫穿整個2020年所有的熱點時間,大部分事情都可以套用一句:"卷就完事兒了"!
卷就完事兒
網際網路是目前絕大部分輿論社交爆發點的火山口,近幾年蓬勃發展的網際網路,帶來的豐富的社交方式,無論是文字交流形式的微博、知乎、微信以及視訊形式的B站,造就了種種便利的同時,也淪為當前"內卷"話題的漩渦。

而作為網際網路中從業人員,無論是找工作還是工作中,處處透漏著卷。關於卷深層次含義及社會含義,大黃才疏學淺,這裡就不班門弄斧了。

本文主要目的從網際網路從業人員角度,從就業的過程中,簡單分析"內卷"的情況。

從HashMap面試聊開

曾幾何時,關於HashMap面試一般都考察的比較簡單,大概是你知道有這麼回事兒就可以通過,通俗講,能夠回答出是什麼面試就妥了。
快樂的打工

從幾個常見的面試問題管窺不同階段的面試難度,面試是如何打工人內卷的修羅場。

HashMap底層資料結構是什麼?

初級版本:你能回答出HashMap是陣列+連結串列+紅黑樹實現的,大致就滿足要求了。

如果能夠給面試官繪製如下這張底層結構圖,那麼恭喜你,可能會給人留下能力很強的印象。

HashMap底層結構

中級版本,已經不再是簡單的是什麼的問題了,而是開始追求是什麼和為什麼了。

面試官:陣列的初始長度是多少?
打工人:陣列初始預設是16,負載因子為0.75,也就是說每次元素個數達到 容量*負載因子時則開始擴容。

面試官:為什麼需要採用連結串列呢?
打工人:當某個位置的key發生hash衝突時,則開始用連結串列來儲存,也就是用陣列+連結串列來儲存元素。在每個陣列元素上都一個連結串列結構,當資料被Hash後,得到陣列下標,把資料放在對應下標元素的連結串列上

面試官:那為什麼又需要用紅黑樹呢?
打工人:當連結串列長度太長(預設超過8)時,連結串列就轉換為紅黑樹,利用紅黑樹快速增刪改查的特點提高HashMap的效能,其中會用到紅黑樹的插入、刪除、查詢等演算法。

按道理,能夠回答到這裡已經夠可以了吧,但是突然有一天,面試官發現好像所有人能夠回答到這個程度,怎麼辦,這就沒有辦法挑選人了。人多了怎麼辦?那就加大力度咯。
終極變態

內卷版:當問題到了這個程度,有時候想想也挺悲劇的,到了一種為了問問題而問問題階段。

面試官:你剛才說陣列初始預設是16,為什麼必須是16,而不是15或者其他的數呢?

這個問題你說他有價值吧,肯定是有的,最初HashMap設計者肯定是處於效能考慮選擇16,但是總有一種偏離了面試的初衷。

打工人小卷:HashMap陣列初始容量採用16,主要是為了在取模和擴容時做優化,同時為了減少衝突,HashMap定位雜湊桶索引位置時,也加入了高位參與運算的過程。比如擴容時重新計算hash,只需要看看原來的hash值新增的那個bit是1還是0就好了,是0的話索引沒變,是1的話索引變成“原索引+oldCap
重新計算hash

面試官:小樣,還難不倒你了。。連結串列太長(超過8),則將連結串列轉化為紅黑樹。為啥不直接使用紅黑樹呢?

打工人小卷看著仗勢,搬出來自己看原始碼的精神。

原始碼中明確寫到:"因為樹節點的大小是連結串列節點大小的兩倍,所以只有在容器中包含足夠的節點保證使用才用它”,顯然儘管轉為樹使得查詢的速度更快,但是在節點數比較小的時候,此時對於紅黑樹來說記憶體上的劣勢會超過查詢等操作的優勢,自然使用連結串列更加好。

但是當節點多的時候,紅黑樹查詢一個元素時間複雜度為O(logN),而連結串列時間複雜度為O(N),整體看節點多時紅黑樹效能更高。

面試官:那為什麼是8的時候轉,而不是9或者其他數值呢?

好傢伙,這個我真的沒有考慮過,但是您先彆著急,萬事不決,問JDKjdk原始碼中還真的有寫。原文如下:
連結串列轉紅黑樹閾值為什麼是8

簡單一句話是:作者做了大量的測試發現,在隨機雜湊碼下,雜湊表中節點的頻率遵循泊松分佈(不清楚為何物的自行百度哈),而根據統計,忽略方差,當長度為8的時候,再出現雜湊衝突的概率已經很小了(千萬分之一),再往後調整並沒有很大意義。

總結

一個HashMap的底層資料結構就能被挖出這麼多"深層次"的東西,被挖掘出來的東西肯定是好的,至少說明了學習嚴謹性。至於說這種面試有多大的價值,我這裡不做過多評價,但是我本人持有保留意見。

現在很多人評價面試說的很好:八股文面試,萬物皆可套路。本來一個問題能回答出是什麼、有什麼用、為什麼如此,我覺得就可以達到通過的階段。但是面對不斷融入新人(當然我也是其中一員),招人需求端人數趨於穩定,供大於求,對於需求端如何挑選出更加"優秀"的人才是一個難題,對於供給端如果給別人呈現出更好的"妝態"又是一個難題。供需不平衡或者說生產力不解決,找工作內卷只會日益嚴重。

你看,我這篇文章也是一種內卷的表現。

番外

另外,關注大黃奔跑公眾號,第一時間收穫獨家整理的面試實戰記錄及面試知識點總結。

我是大黃,一個只會寫HelloWorld的程式設計師,我們們下期見。

掃一掃

相關文章