本人最近幾年一直在作java後端方面的技術面試官,而在最近兩週,又密集了面試了一些java初級和高級開發的候選人,在面試過程當中,我自認爲比較慎重,遇到問題回答很差的候選人,我總會再三從不一樣方面提問,只有當反覆確認能力不行纔會下結論,相反,若是候選人給個人印象不錯,我也會從多個角度來衡量,以避免招進會說但不會幹活的「大忽悠」。java
其實倒也不是我故意要爲難候選人,畢竟入職後就是同事,但面試官的職責使然,並且,若是資深的面試官通常也這樣。nginx
寫到這裏,恐怕會嚇到一些想要面試的朋友,能力強和能力弱都會被多問,那怎麼辦?面試
這就是本文將要講到的主題:如何準備Java初級和高級的技術面試。算法
1. 只能經過簡歷和麪試來衡量,別無他法。若是某位大牛確認能力很行,但面試時沒法充分地自證能力,那對不起了,過不了,現實就這樣。spring
2. 若是面試官因爲能力不行,招進來一個大忽悠,那估計會被領導罵。並且不再會被讓面試了,給領導的印象就很差了。因此不能評主觀印象,而是會有些客觀標準,具體而言,就是從多個方面問些題目,答好答壞就看候選人的。數據庫
其實一些題目都差很少,但不一樣能力的面試官問問題的切入點和漸進程度會不一樣,並且有經驗的面試官會挖掘候選人的優點,並能從候選人的說辭中判斷候選人是真懂仍是忽悠。 後端
記得以前考政治,某個大題10分,分5個點,每一個點的標準答案很少,也就一兩句話。比較取巧的作法是,涵蓋點要全,每一個點無需多說,但要說到點子上。相反,若是在某個點作得再多,其它點沒覆蓋到,只能拿這個點的分。設計模式
同理,在面試時,應當綜合準備 java Core,數據庫,框架,分佈式等方面的題目。根據我面試的結果,我發現很多候選人走了彎路,他們或者乾脆不許備,準備時可能方法不到位,單準備一個方面。好比只准備了算法題,在這方面回答很好,但其它方面就一無所知了。數組
因此說,沒有所謂的必定能成功的面試祕籍,但有能夠幫助提高成功率的準備方法。安全
切記,面試前必定得準備,不然成功的可能性很低,準備時,得綜合看各方面的點。至於每一個點要到什麼程度,後文會講到。
初級開發而言,須要讓面試官感受出以下的要點。
1. 熟悉SSM架構,至少在項目裏作過。
這個的說法是,介紹項目時,用一個業務流程來講spring mvc如何作的。
2. 知道Spring MVC中的細節,好比@Autowired的用法,如何把url映射到Controller上,ModelAndView對象返回的方式等。
3. 最好結合項目的用法,說下你是怎麼用AOP,攔截器的,好比說能夠經過攔截器攔截非法請求,怎麼用 AOP輸出日誌等。
4. 關於ORM方面,不限用過哪一種,但得知道一對一,一多多,多對多等的用法,以及cascade和inverse的用法。
5. 最好知道聲明式事務的作法。
若是你要應聘高級開發,那在上述基礎上,最好了解以下的知識點:
很多候選人會看不少SQL的技巧,好比select該怎麼寫,insert又該怎麼寫,但僅限於此,不會再準備其它的。
這樣就很吃虧,由於面試官會認爲,哪怕是初級開發,SQL語句也該會寫,因此這塊不會多問,而會問以下方面的問題。
1. 索引怎麼建的,怎麼用的?好比我建好了一個索引,在where 語句裏寫 name like '123%'會不會走索引,怎麼狀況下不應建索引,哪些語句不會走索引。
2. 除了索引以外,你有過哪些SQL優化方面的經驗,好比分庫分表,或經過執行計劃查看SQL的優化點。這最好是能結合你作的項目實際來說。
這裏,我面試下來,大概有70%的候選人只知道基本SQL的寫法,因此哪怕你是隻有理論經驗,會說一些優化點,也是很是有利的。
這塊對於高級開發而言,更得了解優化方面的技能。
從去年到如今,我根據市場技術棧的需求,錄製了一套最新的Java精講視頻教程,很是適合零基礎小白入門,須要的同窗能夠加個人Java學習交流羣:641121948,羣文件裏面還有我這幾年整理的學習手冊,面試題,開發工具,PDF文檔教程,你均可以自行去下載。
這塊是基礎,其實不少問的問題,候選人必定會在項目裏用到,但不多能說好說全。
這塊主要會從集合,多線程,異常處理流程以及JVM虛擬機這些方面來問。
集合方面:
1. hashcode有沒有重寫過?在什麼場景下須要重寫。若是能夠,結合hash表的算法,說下hashmap的實現原理。
對於高級開發而言,最好經過ConcurrentHashMap來講明下併發方面的底層實現代碼。
2. ArrayList,LinkedList的差異,好比一個基於數組,一個基於鏈表,它們均是線程不安全的,ArrayList的擴容作法等。
對於高級而言,最好看下底層的代碼。
3. Set如何實現防重的,好比TreeSet和HashSet等。
4. Collection的一些方法,好比比較方法,包裝成線程安全的方法等。
5. 可能有些面試官會問,如何經過ArrayList實現隊列或堆棧,這個能夠準備下。
多線程方面,其實在項目裏不怎麼會用到,但會問以下的問題:
1. synchronized和可重入鎖的差異,而後可能會順便問下信號量等防併發的機制。
2. 在線程裏該如何返回值,其實就是callable runnable 區別。
3. 必定得經過ThreadLocal或volatile關鍵字,來講明線程的內存模型。
4. 線程池方面,會用,瞭解些經常使用參數
線程方面,可能問得比較多的就是併發機制,若是是高級開發,可能會問得深些。
虛擬機方面
1. 結構圖和流程能夠大體說下。
2. 必定得了解針對堆的垃圾回收機制,具體而言,能夠畫個圖,說下年輕代年老代等。
3. 說下垃圾回收的流程,而後針對性地說下如何在代碼中優化內存性能。
4. 最好說下若是出現了OOM異常,該怎麼排查?如何看Dump文件。
5. GC的一些概念,好比強弱軟引用,finalize方法等,這些能夠準備下。
這塊好準備,不過話說哪怕這些沒回答好,但能證實有相關技能的項目經驗,通常也會讓過。
不過在這塊,很多候選人就本末倒置了,好比就準備算法,設計模式,剛纔提到的框架,數據庫和Java Core方面就不許備了。這樣很吃虧,就比如考政治只複習了一個點,其它一點也不許備。
1. 大多數的候選人(大概7成)直接就來了,不作任何準備。要知道,面試和項目其實有些脫節,哪怕項目作得再好,不作準備照樣通不過,只要我確認過這類人確實沒法達標,我拒掉他們沒任何心理負擔,誰讓他們不許備?
2. 還有些候選人態度很好,明顯準備過,但沒準備到位,好比像剛纔所說,只准備了算法,或者在Java Core方面,只看了集合方面的面試題。對於這些同窗,哪怕是過了,我也會感到可惜,畢竟若是面試好些的話,工資也能更高些,至於哪些過不了的,我敢說,若是他們準備過,估計就不是這個結果了。
其實我也知道,人無完人,哪怕我本身去面試,也不可能面面俱到,因此,我不會要求候選人什麼問題都能回答出,甚至大多答錯也不要緊,只要能證實本身的能力便可經過面試。
我也和很多面試官交流過,根據咱們的經驗,若是候選人能說出以下的知識點,即能證實他在這個領域比較資深了,在這塊,我可能就不會過多地問問題了。
架構方面
1. 能證實本身能夠幹活(這不難),同時能結合底層代碼說出IOC,AOP或Spring MVC的流程,只要能說出一個便可。或者能說出攔截器,Controller等的高級用法。
2. 能證實本身有Spring Boot或Spring Cloud的經驗,好比能說出些Spring Cloud組件的用法。
3. 若是能證實本身有分佈式開發的經驗,那最好了,其實這不難證實,好比能說出服務的包是放在多臺機器上(大多數公司其實都這樣),並且能說出如何部署,如何經過nginx等作到負載均衡。
數據庫方面,其實講清楚一個問題便可:如何進行SQL調優,好比經過索引,看執行計劃便可,若是有其它的優化點,說清楚便可。
Java Core方面,這裏給出些訣竅:
1. 能結合ConcurrentHashMap的源代碼,說出final,volatile,transient的用法,以及在其中如何用Lock對象防止寫併發。
2. 結合一個項目實際,說下設計模式的實踐。
3. 多線程方面,能說出Lock或volatile等高級知識點的用法。
4. 這塊最取巧:說下GC的流程,以及如何經過日誌和Dump文件排查OOM異常,若是再高級些的話,說下如何在代碼中優化內存代碼。
訣竅點歸結成一個:能結合源代碼或項目實際,說出些比較資深的問題。
本文的側重點是:
面試必定得準備 (重要的話說三遍,這裏已經超過3遍了)
如何全面充分地準備。
至於爲何要寫這個文章?我得不停地總結我做爲面試官的技巧,這樣我在面試中也能更高效更準確地招到合適的人才。
不過話說回來,這篇文章應該對你們多少有些幫助,由於不是每一個面試官都肯泄漏面試內幕的。
在後篇博文裏,我將在以前博文的基礎上講述如何準備簡歷,從而提高簡歷經過初選的機率,以前我寫過相似的文章。