99%的面试官都会问到的Java面试题
轉載自??99%的面試官都會問到的Java面試題?
最近是招聘季,所謂金九銀十,正是跳槽的好幾節。今天,給大家整理了一些Java面試常考的經典題目,我們一道一道來分析一下。
?
?
經典面試題
?
1、談談你對 Java 平臺的理解?“Java 是解釋執行”,這句話正確嗎?
考點分析:對于這類籠統的問題,你需要盡量表現出自己的思維深入并系統化,Java 知識理解得也比較全面,一定要避免讓面試官覺得你是個“知其然不知其所以然”的人。畢竟明白基本組成和機制,是日常工作中進行問題診斷或者性能調優等很多事情的基礎,相信沒有招聘方會不喜歡“熱愛學習和思考”的面試者。
回歸正題,對于 Java 平臺的理解,可以從很多方面簡明扼要地談一下,例如:Java 語言特性,包括泛型、Lambda 等語言特性;基礎類庫,包括集合、IO/NIO、網絡、并發、安全等基礎類庫。對于我們日常工作應用較多的類庫,面試前可以系統化總結一下,有助于臨場發揮。
下圖是我總結的一個相對寬泛的藍圖供你參考。
? ? ? ?
2、對比Hashtable、HashMap、TreeMap有什么不同?
考點分析:上面的回答,只是對一些基本特征的簡單總結,針對Map相關可以擴展的問題很多,從各種數據結構、典型應用場景,到程序設計實現的技術考量,尤其是在Java 8里,HashMap本身發生了非常大的變化,這些都是經常考察的方面。
很多朋友向我反饋,面試官似乎鐘愛考察HashMap的設計和實現細節,所以今天我會增加相應的源碼解讀,主要專注于下面幾個方面:
-
理解Map相關類似整體結構,尤其是有序數據結構的一些要點。
-
從源碼去分析HashMap的設計和實現要點,理解容量、負載因子等,為什么需要這些參數,如何影響Map的性能,實踐中如何取舍等。
-
理解樹化改造的相關原理和改進原因。?
除了典型的代碼分析,還有一些有意思的并發相關問題也經常會被提到,如HashMap在并發環境可能出現無限循環占用CPU、size不準確等詭異的問題。?
我認為這是一種典型的使用錯誤,因為HashMap明確聲明不是線程安全的數據結構,如果忽略這一點,簡單用在多線程場景里,難免會出現問題。
理解導致這種錯誤的原因,也是深入理解并發程序運行的好辦法。對于具體發生了什么,你可以參考這篇很久以前的分析,里面甚至提供了示意圖,我就不再重復別人寫好的內容了。?
?
3、Java 提供了哪些 IO 方式? NIO 如何實現多路復用?
考點分析:在實際面試中,從傳統 IO 到 NIO、NIO 2,其中有很多地方可以擴展開來,考察點涉及方方面面,比如:
-
基礎 API 功能與設計, InputStream/OutputStream 和 Reader/Writer 的關系和區別。
-
NIO、NIO 2 的基本組成。
-
給定場景,分別用不同模型實現,分析 BIO、NIO 等模式的設計和實現原理。
-
NIO 提供的高性能數據操作方式是基于什么原理,如何使用?
-
或者,從開發者的角度來看,你覺得 NIO 自身實現存在哪些問題?有什么改進的想法嗎?
IO 的內容比較多,專欄一講很難能夠說清楚。IO 不僅僅是多路復用,NIO 2 也不僅僅是異步 IO,尤其是數據操作部分,會在專欄下一講詳細分析。
?
4、后臺服務出現明顯“變慢”,談談你的診斷思路?
考點分析:今天我選擇的是一個常見的并且比較貼近實際應用的的性能相關問題,我提供的回答包括兩部分。
-
在正面回答之前,先探討更加精確的問題定義是什么。有時候面試官并沒有表達清楚,有必要確認自己的理解正確,然后再深入回答。
-
從系統、應用的不同角度、不同層次,逐步將問題域盡量縮小,隔離出真實原因。具體步驟未必千篇一律,在處理過較多這種問題之后,經驗會令你的直覺分外敏感。
大多數工程師也許并沒有全面的性能問題診斷機會,如果被問到也不必過于緊張,你可以向面試官展示診斷問題的思考方式,展現自己的知識和綜合運用的能力。接觸到一個陌生的問題,通過溝通,能夠條理清晰地將排查方案逐步確定下來,也是能力的體現。
面試官可能會針對某個角度的診斷深入詢問,兼顧工作和面試的需求,我會針對下面一些方面進行介紹。目的是讓你對性能分析有個整體的印象,在遇到特定領域問題時,即使不知道具體細節的工具和手段,至少也可以找到探索、查詢的方向。
-
我將介紹業界常見的性能分析方法論。
-
從系統分析到JVM、應用性能分析,把握整體思路和主要工具。對于線程狀態、JVM內存使用等很多方面,我在專欄前面已經陸陸續續介紹了很多,今天這一講也可以看作是聚焦性能角度的一個小結。
?
5、談談你的GC調優思路?
考點分析:今天考察的GC調優問題是JVM調優的一個基礎方面,很多JVM調優需求,最終都會落實在GC調優上或者與其相關,我提供的是一個常見的思路。
真正快速定位和解決具體問題,還是需要對JVM和GC知識的掌握,以及實際調優經驗的總結,有的時候甚至是源自經驗積累的直覺判斷。面試官可能會繼續問項目中遇到的真實問題,如果你能清楚、簡要地介紹其上下文,然后將診斷思路和調優實踐過程表述出來,會是個很好的加分項。
專欄雖然無法提供具體的項目經驗,但是可以幫助你掌握常見的調優思路和手段,這不管是面試還是在實際工作中都是很有幫助的。另外,我會還會從下面不同角度進行補充:
-
涉及具體的GC類型,JVM的實際表現要更加復雜。目前,G1已經成為新版JDK的默認選擇,所以值得你去深入理解。
-
因為G1 GC一直處在快速發展之中,我會側重它的演進變化,尤其是行為和配置相關的變化。并且,同樣是因為JVM的快速發展,即使是收集GC日志等方面也發生了較大改進。
-
從GC調優實踐的角度,理解通用問題的調優思路和手段。
?
面試者常犯錯誤
?
我在面試候選人中經常能體會到,有些面試者確實是認真努力工作,但坦白說表現出的能力水平卻不足以通過面試,通常是兩方面原因:
1、“知其然不知其所以然”。做了多年技術,開發了很多業務應用,但似乎并未思考過種種技術選擇背后的邏輯。坦白說,我并不放心把具有一定深度的任務交給他。
2、知識碎片化,不成系統。在面試中,面試者似乎無法完整、清晰地描述自己所開發的系統,或者使用的相關技術。平時可能埋頭苦干,或者過于死磕某個實現細節,并沒有抬頭審視這些技術。
?
?
面試準備資料
關于面試準備,尤其是Java類的面試內容,給大家推薦一些我覺得不錯的資料。
書籍類
《深入理解Java虛擬機》
《Effective Java》
《程序員面試寶典(第五版)》
《可伸縮服務架構:框架與中間件》
?
課程類
《Java核心技術36講》
《深入拆解Java虛擬機》
《從0開始學微服務》
《從0開始學架構》
總結
以上是生活随笔為你收集整理的99%的面试官都会问到的Java面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跟我学 Java 8 新特性之 Stre
- 下一篇: 用完美的受众重新定位理想的客户