跳槽時,這些Java面試題99%會被問到

我在 Oracle 已經工作了近 7 年,面試過從初級到非常資深的Java工程師,且由于 Java 組工作任務的特點,我非常注重面試者的計算機科學基礎和編程語言的理解深度,可以不要求面試者非要精通 Java。所以,如果你對 C/C++ 等其他語言能夠掌握得非常系統和深入,也是符合需求的。

工作多年以及在面試中,我經常能體會到,有些面試者確實是認真努力工作,但坦白說表現出的能力水平卻不足以通過面試,通常是兩方面原因:

1、“知其然不知其所以然”。做了多年技術,開發了很多業務應用,但似乎并未思考過種種技術選擇背后的邏輯。坦白說,我并不放心把具有一定深度的任務交給他。

2、知識碎片化,不成系統。在面試中,面試者似乎無法完整、清晰地描述自己所開發的系統,或者使用的相關技術。平時可能埋頭苦干,或者過于死磕某個實現細節,并沒有抬頭審視這些技術。

前人已經掉過的坑,后來的同學就別再“前仆后繼”了!

我從我的專欄《Java核心技術36講》里整理出來了8道Java經典面試題,會從“典型回答”、“考點分析”、“知識擴展”三方面剖析這道題的來龍去脈及知識要點。不過下文大部分選取了“考點分析”部分,對“典型回答”、“知識擴展”感興趣的朋友,可以拉到文末,掃碼或者點擊“閱讀原文”訂閱我的專欄。

至于為什么選取“考點分析”,授人以魚不如授人以漁,希望大家能通過考點的分析引導,自主思考以找出答案。

Java基礎

1、談談你對 Java 平臺的理解?“Java 是解釋執行”,這句話正確嗎?

考點分析:

對于這類籠統的問題,你需要盡量表現出自己的思維深入并系統化,Java 知識理解得也比較全面,一定要避免讓面試官覺得你是個“知其然不知其所以然”的人。畢竟明白基本組成和機制,是日常工作中進行問題診斷或者性能調優等很多事情的基礎,相信沒有招聘方會不喜歡“熱愛學習和思考”的面試者。

回歸正題,對于 Java 平臺的理解,可以從很多方面簡明扼要地談一下,例如:Java 語言特性,包括泛型、Lambda 等語言特性;基礎類庫,包括集合、IO/NIO、網絡、并發、安全等基礎類庫。對于我們日常工作應用較多的類庫,面試前可以系統化總結一下,有助于臨場發揮。

下圖是我總結的一個相對寬泛的藍圖供你參考。

2、請對比 Exception 和 Error,另外,運行時異常與一般異常有什么區別?

考點分析:

分析 Exception 和 Error 的區別,是從概念角度考察了 Java 處理機制。總的來說,還處于理解的層面,面試者只要闡述清楚就好了。

我們在日常編程中,如何處理好異常是比較考驗功底的,我覺得需要掌握兩個方面。

第一,理解 Throwable、Exception、Error 的設計和分類。比如,掌握那些應用最為廣泛的子類,以及如何自定義異常等。

很多面試官會進一步追問一些細節,比如,你了解哪些 Error、Exception 或者 RuntimeException?我畫了一個簡單的類圖,并列出來典型例子,可以給你作為參考,至少做到基本心里有數。

第二,理解 Java 語言中操作 Throwable 的元素和實踐。掌握最基本的語法是必須的,如 try-catch-finally 塊,throw、throws 關鍵字等。與此同時,也要懂得如何處理典型場景。

3、談談 Java 反射機制,動態代理是基于什么原理?

考點分析:

這個題目給我的第一印象是稍微有點誘導的嫌疑,可能會下意識地以為動態代理就是利用反射機制實現的,這么說也不算錯但稍微有些不全面。功能才是目的,實現的方法有很多。

總的來說,這道題目考察的是 Java 語言的另外一種基礎機制: 反射,它就像是一種魔法,引入運行時自省能力,賦予了 Java 語言令人意外的活力,通過運行時操作元數據或對象,Java 可以靈活地操作運行時才能確定的信息。而動態代理,則是延伸出來的一種廣泛應用于產品開發中的技術,很多繁瑣的重復編程,都可以被動態代理機制優雅地解決。

從考察知識點的角度,這道題涉及的知識點比較龐雜,所以面試官能夠擴展或者深挖的內容非常多,比如:

考察你對反射機制的了解和掌握程度。

動態代理解決了什么問題,在你業務系統中的應用場景是什么?

JDK 動態代理在設計和實現上與 cglib 等方式有什么不同,進而如何取舍?

4、Java 提供了哪些 IO 方式? NIO 如何實現多路復用?

在實際面試中,從傳統 IO 到 NIO、NIO 2,其中有很多地方可以擴展開來,考察點涉及方方面面,比如:

基礎 API 功能與設計, InputStream/OutputStream 和 Reader/Writer 的關系和區別。

NIO、NIO 2 的基本組成。

給定場景,分別用不同模型實現,分析 BIO、NIO 等模式的設計和實現原理。

NIO 提供的高性能數據操作方式是基于什么原理,如何使用?

或者,從開發者的角度來看,你覺得 NIO 自身實現存在哪些問題?有什么改進的想法嗎?

IO 的內容比較多,專欄一講很難能夠說清楚。IO 不僅僅是多路復用,NIO 2 也不僅僅是異步 IO,尤其是數據操作部分,會在專欄下一講詳細分析。

5、如何保證容器是線程安全的?ConcurrentHashMap 如何實現高效地線程安全?

典型回答:

Java 提供了不同層面的線程安全支持。在傳統集合框架內部,除了 Hashtable 等同步容器,還提供了所謂的同步包裝器(Synchronized Wrapper),我們可以調用 Collections 工具類提供的包裝方法,來獲取一個同步的包裝容器(如 Collections.synchronizedMap),但是它們都是利用非常粗粒度的同步方式,在高并發情況下,性能比較低下。

另外,更加普遍的選擇是利用并發包提供的線程安全容器類,它提供了:

各種并發容器,比如 ConcurrentHashMap、CopyOnWriteArrayList。

各種線程安全隊列(Queue/Deque),如 ArrayBlockingQueue、SynchronousQueue。

各種有序容器的線程安全版本等。

具體保證線程安全的方式,包括有從簡單的 synchronize 方式,到基于更加精細化的,比如基于分離鎖實現的 ConcurrentHashMap 等并發實現等。具體選擇要看開發的場景需求,總體來說,并發包內提供的容器通用場景,遠優于早期的簡單同步實現。

6、談談接口和抽象類有什么區別?

考點分析:

這是個非常高頻的 Java 面向對象基礎問題,看起來非常簡單的問題,如果面試官稍微深入一些,你會發現很多有意思的地方,可以從不同角度全面地考察你對基本機制的理解和掌握。

比如:

對于 Java 的基本元素的語法是否理解準確。能否定義出語法基本正確的接口、抽象類或者相關繼承實現,涉及重載(Overload)、重寫(Override)更是有各種不同的題目。

在軟件設計開發中妥善地使用接口和抽象類。你至少知道典型應用場景,掌握基礎類庫重要接口的使用;掌握設計方法,能夠在 review 代碼的時候看出明顯的不利于未來維護的設計。

掌握 Java 語言特性演進。現在非常多的框架已經是基于 Java 8,并逐漸支持更新版本,掌握相關語法,理解設計目的是很有必要的。

Java進階

7、synchronized 底層如何實現?什么是鎖的升級、降級?

考點分析:

今天的問題主要是考察你對 Java 內置鎖實現的掌握,也是并發的經典題目。我在前面給出的典型回答,涵蓋了一些基本概念。如果基礎不牢,有些概念理解起來就比較晦澀,我建議還是盡量理解和掌握,即使有不懂的也不用擔心,在后續學習中還會逐步加深認識。

我個人認為,能夠基礎性地理解這些概念和機制,其實對于大多數并發編程已經足夠了,畢竟大部分工程師未必會進行更底層、更基礎的研發,很多時候解決的是知道與否,真正的提高還要靠實踐踩坑。

后面我會進一步分析:

從源碼層面,稍微展開一些 synchronized 的底層實現,并補充一些上面答案中欠缺的細節,有同學反饋這部分容易被問到。如果你對 Java 底層源碼有興趣,但還沒有找到入手點,這里可以成為一個切入點。

理解并發包中 java.util.concurrent.lock 提供的其他鎖實現,畢竟 Java 可不是只有 ReentrantLock 一種顯式的鎖類型,我會結合代碼分析其使用。

8、synchronized 和 ReentrantLock 有什么區別?有人說 synchronized 最慢,這話靠譜嗎?

考點分析:

今天的題目是考察并發編程的常見基礎題,我給出的典型回答算是一個相對全面的總結。

對于并發編程,不同公司或者面試官面試風格也不一樣,有個別大廠喜歡一直追問你相關機制的擴展或者底層,有的喜歡從實用角度出發,所以你在準備并發編程方面需要一定的耐心。

我認為,鎖作為并發的基礎工具之一,你至少需要掌握:

理解什么是線程安全。

synchronized、ReentrantLock 等機制的基本使用與案例。

更近一步,你還需要:

掌握 synchronized、ReentrantLock 底層實現;理解鎖膨脹、降級;理解偏斜鎖、自旋鎖、輕量級鎖、重量級鎖等概念。

掌握并發包中 java.util.concurrent.lock 各種不同實現和案例分析。

典型回答:

synchronized 是 Java 內建的同步機制,所以也有人稱其為 Intrinsic Locking,它提供了互斥的語義和可見性,當一個線程已經獲取當前鎖時,其他試圖獲取的線程只能等待或者阻塞在那里。

在 Java 5 以前,synchronized 是僅有的同步手段,在代碼中, synchronized 可以用來修飾方法,也可以使用在特定的代碼塊兒上,本質上 synchronized 方法等同于把方法全部語句用 synchronized 塊包起來。

ReentrantLock,通常翻譯為再入鎖,是 Java 5 提供的鎖實現,它的語義和 synchronized 基本相同。再入鎖通過代碼直接調用 lock() 方法獲取,代碼書寫也更加靈活。與此同時,ReentrantLock 提供了很多實用的方法,能夠實現很多 synchronized 無法做到的細節控制,比如可以控制 fairness,也就是公平性,或者利用定義條件等。但是,編碼中也需要注意,必須要明確調用 unlock() 方法釋放,不然就會一直持有該鎖。

synchronized 和 ReentrantLock 的性能不能一概而論,早期版本 synchronized 在很多場景下性能相差較大,在后續版本進行了較多改進,在低競爭場景中表現可能優于 ReentrantLock。

在這里順便給大家推薦一個架構交流群:617434785,里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發、高性能、分布式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系。還能領取免費的學習資源。相信對于已經工作和遇到技術瓶頸的碼友,在這個群里會有你需要的內容。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容

  • 題目一 請對比 Exception 和 Error,另外,運行時異常與一般異常有什么區別? 考點分析: 分析 Ex...
    糖寶_閱讀 652評論 0 13
  • 這樣的日子一起做個約定吧迎著燦悠悠的陽光告訴我風兒去了哪里小草可否回家你俏笑的眉目蕩開春水般漣漪噓,別吵,我再打個...
    淺淺是水閱讀 634評論 45 72
  • 前言: 在PC端,我們調試網頁一般直接打開chrome或者firefox的開發者工具就OK了,chrome也有手機...
    感覺被掏空閱讀 13,820評論 6 8
  • 今天是星期五,原本說今天要更新的,臨時決定以后都改成星期一更新,原本星期三的內容調整到星期四。就醬。晚安。
    佑佑_52閱讀 200評論 0 0
  • 0901 擁有迷人的雙眼 0902 今天你微笑了嗎 0903 勿焦慮 身心輕 0904 我在思考 0905 言語的...
    李旭玲的后花園閱讀 110評論 0 1