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架構開發:760940986 群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!