1. 程式人生 > >程式設計師週末阿里面試,5分鐘就被一道題秒殺:HashMap與Hashtable

程式設計師週末阿里面試,5分鐘就被一道題秒殺:HashMap與Hashtable

開發十年,就只剩下這套架構體系了! >>>   

你們可能會想,我這麼菜的嗎?5分鐘都堅持不了?

本文說起來會有點尷尬,畢竟這是我曾經經歷過的故事

那時候的我還真菜,每天寫著 if/ for 及一些簡單的業務邏輯程式碼,雖工作有些日子了,但技術水平還停留在剛畢業的起步階段。

記得,那是一個週末,我去某知名網際網路公司面試,好像不到五分鐘,我就被面試官親切地趕出來了,當時我那個尷尬,內心深受打擊。

為什麼會被趕出來?這道題我記得很清楚,我不確定是不是因為這道題,但卻是這道題結束了整個面試,大概的經過是這樣:

面試官:HashMap 和 Hashtable 的區別是什麼?

月亮:……(這個我答上來了,我整理了下,大家可以參考這篇文章:HashMap 和 Hashtable 的 6 個區別。)

面試官:那既然 Hashtable是執行緒安全的,又效能不好,那你還知道別的替代品嗎?

月亮:……(沒答上來)面試官:好吧,那我們今天先聊到這裡吧(起身送我走)……

月亮:好的,謝謝。(尷尬離場)

尷尬後的感悟

現在想起來都覺得尷尬。

現在競爭這麼大,要求那麼高,只會 Hashtable 的程式設計師真不能立足了,至少你得說得出 SynchronizedMap,雖然它的效能和 Hashtable 一樣差,使用了全域性物件鎖來保證執行緒安全性,但至少你不只是會 Hashtable。

其實上面的問題,最佳答案是:ConcurrentHashMap,說完這個,有很大概率面試官又會連番問它的實現原理,以及它在 JDK 各個版本中的不同。

ConcurrentHashMap 是 JDK 1.5 新增的新集合,用來保證執行緒安全性,提升 Map 集合的併發效率。ConcurrentHashMap 使用了 Segment 的概念,預設有 16 個 Segment,Segment 裡面依然還是陣列 + 連結串列的資料結構,相當於給 HashMap 分桶處理了。因每次只會鎖住其中一個 Segment,所以效能非常好。

然而,有意思的是,隨著 JDK 1.8 中對 HashMap 的改進,同時又對 ConcurrentHashMap 進行了改進,拋棄了 Segment + 陣列 + 單向連結串列 的設計,改為了和 HashMap 同樣的 陣列 + 單向連結串列 + 紅黑樹 的資料結構。

同時,ConcurrentHashMap 使用了 CAS 演算法 + Synchronized 來保證集合的執行緒安全性,ConcurrentHashMap 相當於一個性能安全的 HashMap。

ConcurrentHashMap 原始碼相當複雜,後面我會出一篇專門分析 HashMap 和 ConcurrentHashMap 原始碼和原理的文章,請大家關注我的部落格,不要錯過。

不過話又說回來,當初我面試 5 分鐘就被送出來了,其實很正常,誰叫我當時只會Hashtable 呢!就像我現在面試人一樣,如果中高階面試者只會 Hashtable 講不出其他更多的,我也一樣也會把他送出去,初級的還可以理解。

現在很多中高階程式設計師,雖然年限已經達到三年或者五年以上,但實際對多執行緒知識瞭解甚少,還停留在如何實現和使用多執行緒的水平。這種其實和初級程式設計師沒什麼區別,競爭力明顯不足,所以怎麼能要得到比初級程式設計師更高的價格呢?天天寫業務程式碼,又如何成為大牛呢?

總結

所以,我給 Java 程式設計師的一些建議,特別是中高階程式設計師,一定要把 Java 核心技術學好,如多執行緒、集合的應用、資料結構、原理等,這是中高階面試必問的。

不要年紀上去了,對於底層知識卻不知道一二,不然隨著年紀的不斷增長,被淘汰的風險就越大,這樣對於一個靠編碼吃飯的程式來說,真的很可怕!

如果你被我說中了,或許考慮換一個環境?

最近我會陸續分享一些個人的職場經驗,踩坑經歷,以及成長感悟,希望能給一些職場新猿帶來幫助。

我總結出了網際網路公司java程式設計師面試涉及到的絕大部分面試題及答案做成了文件和架構視訊資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分散式、高併發等架構技術資料),希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習,也可以關注我一下以後會有更多幹貨分享。

領取面試資料方式:QQ群架構華山論劍:836442475【點選進入領取】(大牛聚集地)一起交流學習探討!