大家可能會想,我這麼菜的嗎?5分鐘都堅持不了?java
那時候的我還真菜,天天寫着 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【點擊進入領取】(大牛彙集地)一塊兒交流學習探討!