從HashMap面試聊聊網際網路內卷
阿新 • • 發佈:2021-02-26
>微信公眾號:**[大黃奔跑](#jump_10)**
>關注我,可瞭解更多有趣的面試相關問題。
###寫在之前
毫無疑問,回想2020年有什麼詞出現在眼前最多的,無疑是"996"和"內卷",從馬老師的福報論、到年底pdd剛畢業員工猝死,內卷從此從最初談論於學者文章中出圈了,之後一發不可收拾,幾乎能貫穿整個2020年所有的熱點時間,大部分事情都可以套用一句:"卷就完事兒了"!
![卷就完事兒](https://img-blog.csdnimg.cn/20210225120250649.png#pic_center)
網際網路是目前絕大部分輿論社交爆發點的火山口,近幾年蓬勃發展的網際網路,帶來的豐富的社交方式,無論是文字交流形式的微博、知乎、微信以及視訊形式的B站,造就了種種便利的同時,也淪為當前"內卷"話題的漩渦。
而作為網際網路中從業人員,無論是找工作還是工作中,處處透漏著卷。關於卷深層次含義及社會含義,大黃才疏學淺,這裡就不班門弄斧了。
本文主要目的從網際網路從業人員角度,從就業的過程中,簡單分析"內卷"的情況。
###從HashMap面試聊開
曾幾何時,關於HashMap面試一般都考察的比較簡單,大概是你知道有這麼回事兒就可以通過,通俗講,能夠回答出是什麼面試就妥了。
![快樂的打工](https://img-blog.csdnimg.cn/20210225085957748.jpeg#pic_center)
從幾個常見的面試問題管窺不同階段的面試難度,面試是如何打工人內卷的修羅場。
**HashMap底層資料結構是什麼?**
**初級版本**:你能回答出HashMap是陣列+連結串列+紅黑樹實現的,大致就滿足要求了。
如果能夠給面試官繪製如下這張底層結構圖,那麼恭喜你,可能會給人留下能力很強的印象。
![HashMap底層結構](https://img-blog.csdnimg.cn/2021022509062522.png)
中級版本,已經不再是簡單的是什麼的問題了,而是開始追求是什麼和為什麼了。
面試官:陣列的初始長度是多少?
打工人:陣列初始預設是16,負載因子為0.75,也就是說每次元素個數達到 **容量*負載因子**時則開始擴容。
面試官:為什麼需要採用連結串列呢?
打工人:當某個位置的`key`發生`hash`衝突時,則開始用連結串列來儲存,也就是用陣列+連結串列來儲存元素。在每個陣列元素上都一個連結串列結構,當資料被Hash後,得到陣列下標,把資料放在對應下標元素的連結串列上
面試官:那為什麼又需要用紅黑樹呢?
打工人:當連結串列長度太長(預設超過8)時,連結串列就轉換為紅黑樹,利用紅黑樹快速增刪改查的特點提高`HashMap`的效能,其中會用到紅黑樹的插入、刪除、查詢等演算法。
按道理,能夠回答到這裡已經夠可以了吧,但是突然有一天,面試官發現好像所有人能夠回答到這個程度,怎麼辦,這就沒有辦法挑選人了。**人多了怎麼辦?那就加大力度咯。**
![終極變態](https://img-blog.csdnimg.cn/20210225092233607.jpg)
內卷版:當問題到了這個程度,有時候想想也挺悲劇的,到了一種為了問問題而問問題階段。
面試官:你剛才說陣列初始預設是16,為什麼必須是16,而不是15或者其他的數呢?
這個問題你說他有價值吧,肯定是有的,最初HashMap設計者肯定是處於效能考慮選擇16,但是總有一種偏離了面試的初衷。
打工人小卷:`HashMap`陣列初始容量採用16,主要是為了在取模和擴容時做優化,同時為了減少衝突,`HashMap`定位雜湊桶索引位置時,也加入了高位參與運算的過程。比如擴容時重新計算`hash`,只需要看看原來的`hash`值新增的那個bit是1還是0就好了,是0的話索引沒變,是1的話索引變成“原索引`+oldCap`”
![重新計算hash](https://img-blog.csdnimg.cn/20210225093757325.png)
面試官:小樣,還難不倒你了。。連結串列太長(超過8),則將連結串列轉化為紅黑樹。為啥不直接使用紅黑樹呢?
打工人小卷看著仗勢,搬出來自己看原始碼的精神。
原始碼中明確寫到:"因為樹節點的大小是連結串列節點大小的兩倍,所以只有在容器中包含足夠的節點保證使用才用它”,顯然儘管轉為樹使得查詢的速度更快,但是在節點數比較小的時候,此時對於紅黑樹來說記憶體上的劣勢會超過查詢等操作的優勢,自然使用連結串列更加好。
但是當節點多的時候,紅黑樹查詢一個元素時間複雜度為O(logN),而連結串列時間複雜度為O(N),整體看節點多時紅黑樹效能更高。
面試官:那為什麼是8的時候轉,而不是9或者其他數值呢?
好傢伙,這個我真的沒有考慮過,但是您先彆著急,萬事不決,問`JDK`,`jdk`原始碼中還真的有寫。原文如下:
![連結串列轉紅黑樹閾值為什麼是8](https://img-blog.csdnimg.cn/20210225095248358.jpg)
簡單一句話是:作者做了大量的測試發現,在隨機雜湊碼下,雜湊表中節點的頻率遵循**泊松分佈**(不清楚為何物的自行百度哈),而根據統計,忽略方差,當長度為8的時候,再出現雜湊衝突的概率已經很小了(千萬分之一),再往後調整並沒有很大意義。
### 總結
一個`HashMap`的底層資料結構就能被挖出這麼多"深層次"的東西,被挖掘出來的東西肯定是好的,至少說明了學習嚴謹性。至於說這種面試有多大的價值,我這裡不做過多評價,但是我本人持有保留意見。
現在很多人評價面試說的很好:八股文面試,萬物皆可套路。本來一個問題能回答出是什麼、有什麼用、為什麼如此,我覺得就可以達到通過的階段。但是面對不斷融入新人(當然我也是其中一員),招人需求端人數趨於穩定,供大於求,對於需求端如何挑選出更加"優秀"的人才是一個難題,對於供給端如果給別人呈現出更好的"妝態"又是一個難題。供需不平衡或者說生產力不解決,找工作內卷只會日益嚴重。
你看,我這篇文章也是一種內卷的表現。
###番外
另外,關注大黃奔跑公眾號,第一時間收穫獨家整理的面試實戰記錄及面試知識點總結。
我是大黃,一個只會寫`HelloWorld`的程式設計師,咱們下期見。
![掃一掃](https://img-blog.csdnimg.cn/202102232308506.png)