國內的網際網路面試,恐怕是現存的、最接近科舉考試的制度。
國內的八股文確實是獨樹一幟。以美國為例,北美工程師面試比較重視算法(Coding),近幾年也會加入Design輪(系統設計和面向對象設計OOD)和BQ輪(Behavioral question,行為面試問題)。
所以大多數北美工程師的面試準備是這樣的:我見過刷300題左右進Google的,也見過刷1000+題還拿不到offer的.但總的來說,只要面試中遇到的算法題,能夠按自己的思路做出來,並能應對面試官的follow up,這一關基本就妥了。所以大多數人會在跳槽前刷LintCode這類的在線編程測評題庫。
一般來說是分為系統設計和面向對象設計。5年以下經驗的多數會考面向對象設計,和國內不同的是需要畫類圖;5年以上的大多考系統架構設計。參考資料:系統架構設計2021版;面向對象設計OOD,以上都可以免費試聽。
即行為面試問題,常考的問題諸如「你為什麼從上一家公司離職」、「你在之前的工作中做過的最有成就感的事情是什麼?」等。
可以看出,北美工程師是很少「背答案」的,要麼考邏輯思維能力,要麼考編程能力,而不是問概念、問理論。
那麼為什麼國內面試不採取這樣的考察方式呢?簡單來說,網際網路IT行業的求職者太多了,如果考察的是清一溜的算法題和設計題,那麼會要求面試官有極高的技術水平,還要花大量的時間成本和精力。
所以,也許現行的八股文面試不是最優的解法,但也是最符合當前國內IT環境的做法。
話又說回來,現在的Java面試真就老八股文了。我光是整理題目就理了半天,答案背也背不完,在我快要放棄的時候,死馬當活馬醫的聽了阿里P8楊逍的講座《大廠Java高級工程師的求職秘訣》,大佬把Java面試題和所有知識點都講得很通透,感興趣的話,大家也可以去免費試聽一下。
先上這些Java面試真題(Java基礎):
兩個對象的 hashCode()相同,則 equals()也一定為 true,對嗎?java 中的 Math.round(-1.5) 等於多少?java 中操作字符串都有哪些類?它們之間有什麼區別?String str="i"與 String str=new String("i")一樣嗎?回到剛才的問題,Java的面試是需要背的,也確實是老八股文了,但這個背是有技巧的。
這麼簡單的問題相信大家都會,等你答上來了面試官就會繼續追問:
「除了javac你還了解些什麼命令行工具,它們的用途是什麼?」
很多人只答得出jcmd、jps、jinfo、jstat、jmap以及jstack等工具,但對應的用途卻記不清了。答出來的也不要太得意,後面還有靈魂拷問。
既然StringBuffer具備線程安全性,迭代開銷又小,那我們實踐中首選它就ok了嗎?
這正是大廠面試Java程式設計師的基本套路——從簡單題入手,再慢慢的挖掘背後的原理,從而判斷求職者的技術水平,目的是考察對源碼的深挖意識。
所以,想搞定Java面試,一定要擁有精益求精的精神,深挖底層原理,把技術棧學通透。
再舉個例子,在「Java 中操作字符串都有哪些類?它們之間有什麼區別?」這道題上,如果能答出「StringBuffer和StringBuilder都繼承自抽象類AbstractStringBuilder」,面試官就知道你是讀過源碼的人,能給你加不少分。
接下來就是把面試真題全部摸一遍,阿里P8楊逍老師在《大廠Java高級工程師的求職秘訣》的講座中會深入剖析30+道大廠經典面試真題,如果自己學起來比較費勁的話,不如聽一節視頻先入個門,後面也會輕鬆很多。
①Java基礎:String 類的常用方法都有那些?• indexOf():返回指定字符的索引。
• charAt():返回指定索引處的字符。
• replace():字符串替換。
• trim():去除字符串兩端空白。
• split():分割字符串,返回一個分割後的字符串數組。
• getBytes():返回字符串的 byte 類型數組。
• length():返回字符串長度。
• toLowerCase():將字符串轉成小寫字母。
• toUpperCase():將字符串轉成大寫字符。
• substring():截取字符串。
• equals():字符串比較。
②容器:如何決定使用 HashMap 還是 TreeMap?對於在 Map 中插入、刪除和定位元素這類操作,HashMap 是最好的選擇。然而,假如你需要對一個有序的 key 集合進行遍歷,TreeMap 是更好的選擇。基於你的 collection 的大小,也許向 HashMap 中添加元素會更快,將 map 換為 TreeMap 進行有序 key 的遍歷。
③多線程:sleep() 和 wait() 有什麼區別?• sleep():方法是線程類(Thread)的靜態方法,讓調用線程進入睡眠狀態,讓出執行機會給其他線程,等到休眠時間結束後,線程進入就緒狀態和其他線程一起競爭 cpu 的執行時間。
因為 sleep() 是static 靜態的方法,他不能改變對象的機鎖,當一個21塊中調用了 sleep() 方法,線程雖然進入休眠,但是對象的機鎖沒有被釋放,其他線程依然無法訪問這個對象。
• wait():wait()是 Object 類的方法,當一個線程執行到 wait 方法時, 它就進入到一個和該對象相關的等待池,同時釋放對象的機鎖,使得其他線程能夠訪問,可以通過 notify,notifyAll 方法來喚醒等待的線程。
throws 是用來聲明一個方法可能拋出的所有異常信息,throws 是將異常聲明但是不處理,而是將異常往上傳,誰調用我就交給誰處理。而 throw則是指拋出的一個具體的異常類型。
以上只是Java面試的冰山一角,感興趣的話也可以移步楊逍老師的Java面試技巧講座,這門課程非常看重實用性,設計理念就是「通過真題搞定BATJ大廠面試」,通過40天有計劃的訓練,帶你進階到阿里 P6+級別。