從HashMap面試聊聊互聯網內卷

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

寫在以前

毫無疑問,回想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的程序員,我們下期見。

掃一掃

相關文章
相關標籤/搜索