Java面試題解構(gòu)

有次一個同事讓我一同去面試一個候選人,沒仔細(xì)看簡歷,所以在問了設(shè)計模式之后就讓他談一談對內(nèi)存泄漏和垃圾回收的理解,當(dāng)時候選人一下子就懵了。后來才知道,他面的是初、中級開發(fā)職位,想來估計候選人心里也在罵我吧。

我自己用過各式各樣的方法面試候選人,也被各式各樣的方式面試過。有讓拿電腦直接寫代碼的,有讓在白板上寫思路、畫結(jié)構(gòu)的,或者挨個知識點問問題的。面試,應(yīng)該是要測試候選人「是否有做好某些事情的能力」,而不應(yīng)該是「知道某些事情的能力」。雖然這兩者往往是相關(guān)的,但有很大一部分問題卻是對「把事情做好」沒有任何幫助的。其中的一類是那些「你不用的時候只是大概知道,需要使用的時候花一分鐘就可以搞清楚」的問題,就算你是一個比較好學(xué)的開發(fā)者,平時會看一些跟工作關(guān)系不是那么大的東西,并且可以搞得很清楚,但時間一長,再去問你細(xì)節(jié),我想同樣會模糊不清,甚至?xí)鲥e。

本文并不是面試刷題的題庫。而是希望可以通過對面試的問題進(jìn)行分類,幫助Java工程師在準(zhǔn)備面試時,可以高屋建瓴,快速找到所需的知識點。同時會給出一些好的、壞的示例,希望可以幫助到一些人。

面試問題的分類

關(guān)于會被問到的Java方面的問題,大致可以分為以下幾類:

1. Hotspot VM(Runtime、GC、JIT)相關(guān)問題

這些問題其實屬于要了解的東西,對指導(dǎo)編碼、問題排查、運行時邏輯的理解都有好處。

但如果非要問你G1、CMS、Serial垃圾回收器各自的實現(xiàn)方法及其不同,除非你面的就是做JVM調(diào)優(yōu)的職位,那你也是倒了霉了,解決方案只能是面試前突擊鞏固這方面的知識。

2. JDK中特定類的使用問題

如果你的工作會用到一些類,可能你會很熟悉,但老實說,還是會有很多類用了很多次,每次都要去源碼里看注釋的情況……

有注釋為毛要浪費珍貴的腦容量。有病

3. JDK中特定類(或操作符、關(guān)鍵字)的實現(xiàn)問題

相信很大一部分(有工作經(jīng)驗的)工程師的工作內(nèi)容是不需要考慮這些問題的,但很多有追求的工程師都很樂意去探索這些問題,比如HashMap的實現(xiàn)原理,TransferQueue的算法邏輯。

但是,那么多類,誰能保證全部記得很清楚,如果有,一定是來面試前背過了。

4. 其他一些變態(tài)的陷阱問題

各種亂花漸欲迷人眼的問題,如「重載和重寫的區(qū)別」「final、finally、finalize的區(qū)別」之流,實在無力吐槽。出這些題的人估計是想要考察你的基本功,但又懷著不耐煩的心情,所以挖個坑看你怎么跳。

有種你編程不用搜索引擎啊。

這里換個姿勢問,面試官的逼格立馬就顯現(xiàn)了。比如「JDK如何保證在try-catch-finally中的finally塊一定會被執(zhí)行的?」,但這就屬于第3類問題了,如果回答不出來,應(yīng)該引導(dǎo)他通過已有的知識和自己的想法去實現(xiàn)。

5. 解決實際問題

這是真正有價值的問題,可以考察人的思維及解決問題能力的問題。而且不論是業(yè)務(wù)相關(guān),亦或是技術(shù)理論相關(guān)的,都可以問出有價值的問題。

如「自己設(shè)計一個ArrayListLinkedBlockingQueue」,「設(shè)計一個秒殺系統(tǒng)」,「如果碰到XXX問題,你估計是哪里出的問題」等等。

6. 與Java無關(guān)的問題

這種問題通常是為了考察應(yīng)聘者的性格、人品、知識面、學(xué)習(xí)能力等,比如「簡單描述一下HTTPS的工作流程」、「最近是否有在看書或者哪方面的知識」等。有些有套路,可以抱抱佛腳,通過刷題刷出來。其他的只能自求多福了。

相關(guān)問題示例

下面是一些從網(wǎng)上看到或者自己被問到過的一些問題,僅供參考。

第一類問題

1. 簡單描述一下JVM的GC

A:隨意發(fā)揮……可以參考Java 9中的GC調(diào)優(yōu)基礎(chǔ)

這是一個典型的比較有開放性的問題,面試者可以從自己了解的方面入手,如分代、運行時內(nèi)存結(jié)構(gòu)。如果對垃圾回收器比較了解,那更可以侃侃而談。

如果被問到了比較有針對性的問題,那就看你面試前的課補的好不好了。

2. Java中有哪些多線程同步的手段

這個問題也可以延伸出很多知識,synchronized的實現(xiàn)原理、synchronized中的鎖膨脹、為什么有時候使用volatile可以帶來更好的性能、悲觀鎖&樂觀鎖的概念、新一代的基于Lock的鎖機制,更甚者可能會問到Java的內(nèi)存模型(JMM)。

第二類問題

1. StringBuilder vs StringBuffer

A:前者是后者不加鎖的版本,使用場景BlaBla……

現(xiàn)在還有人問這個問題,只有兩種可能:1. 面試官或者候選人的水平比較初級;2. 面試官一下子想不到別的好問的。

2. Java8比Java7添加了什么新的特性

A:Lambda、streams、接口默認(rèn)方法……

我要是背書背的好早學(xué)文科了。

3. Java自帶線程池判斷線程池是否已經(jīng)結(jié)束運行的方法叫什么

A:isShutdown和isTerminated。

4. BlockingQueueCountDownLatchSemeaphore的使用場景
5. java.util.Datejava.sql.Date有什么區(qū)別

A:繼承關(guān)系

不知道這個問題的意義在哪里。

6. 如果要從LinkedBlockingQueue中取出頭部對象,分別哪個方法會返回null、拋錯、阻塞

A:take - 阻塞,poll - 返回null,remove - 拋錯

第三類問題

1. ThreadLocal的實現(xiàn)原理

A:就是一個只有當(dāng)前線程可訪問的以ThreadLocal實例為Key的HashMap,其內(nèi)部的Map實現(xiàn)和HashMap的實現(xiàn)差不多,這個Map的實例存儲在Thread對象上,所以通過封裝,能保證線程只訪問自己的ThreadLocal變量。

好吧,很可能面試官想聽到的就是這樣一句話。

但ThreadLocal之所以重要其實是其背后的設(shè)計思想,它將變量從共享的和需要多線程同步的環(huán)境轉(zhuǎn)移到了線程私有和不需要同步的環(huán)境內(nèi),這種思想可以用來解決很多不同的場景下的問題。

但是,誰關(guān)心這些呢?

2. LinkedList的實現(xiàn)原理

A:它是一個雙向列表,實現(xiàn)了List、Deque、Cloneable等接口

老實說,Deque(雙向隊列)這個東西見過幾次,但沒用過,所以現(xiàn)在也說不太清楚它的特征和實際使用場景,所以也不想胡侃。

3. ConcurrentHashMap的實現(xiàn)原理

A:它是一個對寫操作加了鎖的HashMap,不同的是它做了二次分割,元素被存儲在不同的桶里,以見效鎖的數(shù)據(jù)范圍,提升性能。

在JDK8中對這種實現(xiàn)又進(jìn)行了修改,JDK8中的ConcurrentHashmap基于CAS和TreeBin實現(xiàn)的,不需要對segment或者全局加鎖,只需要對單行枷鎖(hashCode相同),后邊的鏈表是鏈表加紅黑樹。對于單個值的修改使用CAS。

面試官很可能想聽到的是這樣,但這里重要的是分治的概念。其實完全可以讓候選人嘗試自己去設(shè)計一個ConcurrentHashMap,然后引導(dǎo)他去拆分HashMap,這樣才是正道啊。

4. hashcode()equals()的關(guān)系

A:根據(jù)JVM標(biāo)準(zhǔn),equals()相等的對象,hashcode()應(yīng)該永遠(yuǎn)相對,反之則不一定,詳見HashMap的實現(xiàn)。

這個問題其實挺好的,但如果只是簡單的問一下,沒有任何意義,仍然考的是記憶力。

5. TransferQueue的算法是什么樣的,它和BlockingQueue有哪些不同

A:源代碼里有。

這么回答肯定是不好的,還是去補補課吧。如果你覺得面試官問這個太無聊,可以拿到offer后丑拒。

第五類問題

1. 用 wait-notify 寫一段代碼來解決生產(chǎn)者-消費者問題,更進(jìn)一步,在分布式的環(huán)境下怎么解決

A:哈哈哈,我們來寫段代碼吧……

wait()notify()都是線程間通信的方法,可以直接對線程的行為進(jìn)行操作。他們的本質(zhì)其實是傳遞生產(chǎn)者-消費者各自的消息,理解了這一點,那么在分布式環(huán)境下就很簡單了,只要找到一個第三方的可以用來傳遞消息的媒介(Zookeeper、Redis、Kafka等)就可以了。

2. 設(shè)計一個線程池

A:可以參考Java線程池的理論與實踐

如果對JDK的線程池java.util.concurrent.ThreadPoolExecutor比較了解,可以把一些簡單的特性放上去。如果不了解,可以直接設(shè)計一個線程數(shù)組,然后加一些業(yè)務(wù)邏輯。所謂線程池,基本也就如此。

3. 設(shè)計一個IOC容器

A:用反射,注解,還有IOC的理論

第六類問題

1. 談?wù)勀銓10K問題的理解

A:NIO對BIO在吞吐量上的優(yōu)勢,可以參考從I/O模型到Netty(一)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內(nèi)容

  • 阿里java相關(guān)問題,都是之前通過不斷優(yōu)秀人才的鋪墊總結(jié)的,希望對大家?guī)椭?,祝面試成功,有個更好的職業(yè)規(guī)劃。 1、...
    Java架構(gòu)師Carl閱讀 2,860評論 1 94
  • 前兩天看到一個文章,關(guān)于“深度思考”,指穿過表面現(xiàn)象,把握事物核心本質(zhì)的思維活動。這算是最近的一個流行詞,大約是人...
    無畏的想象力閱讀 305評論 1 2
  • CocoaPods基于Ruby語言開發(fā)而成,因此安裝CocoaPods前需要安裝Ruby環(huán)境。幸運的是Mac系統(tǒng)默...
    男神已認(rèn)證閱讀 1,271評論 0 2