想進BAT面試的Java程式設計師 看完這個你們還覺得offer很難拿嗎???
阿里面試問些什麼?
參加阿里的社招面試,而社招不同於校招,問題的範圍其實是很隨機的。因為能參加一些比較知名的網際網路公司社招的人,70%以上都會有個3-5年的經驗。這倒不是說一兩年經驗的同學沒有機會進這些公司,而是因為這種公司,大部分情況下只招一些比較資深的開發和應屆生,而不招那些處於中間階段的人。而1-2年經驗的同學,往往就剛好處於這個尷尬的階段。
對於能有3-5年經驗的這部分人中,每個人的經歷又都不同,所擅長的點也不一樣,因此這就會導致每個人的問題和範圍都不太一樣。
很少說有哪個知名的網際網路公司,比如BAT、京東、360、搜狐、網易等這些公司,其社招面試還有固定的問題和模式,讓你可以像應屆生面試一樣,在面試前靠臨時抱佛腳度過這一關。
大部分公司在社招的時候,不光是阿里,其它公司也都一樣,基本上都分為兩個階段的提問。
第一個階段是主語言本身以及它的高階特性
第二個階段是講述自己的專案,並在中間穿插著問題
社招面試如何準備1主語言本身以及它的高階特性。
主語言當然就是你平日裡拿來賺錢的傢伙。
主語言很顯然是Java,那麼對於Java來說,它的語言本身以及它的高階特性,都有哪些比較容易在面試中問到呢?
一般情況下,主要有以下知識點很容易被問到。(PS:以下所列舉的,都是一些Java相對而言比較高階一點的知識點,因為這裡談的是社招,而不是校招)
1、Java的資料結構相關的類實現原理,比如LinkedList,ArrayList,HashMap,TreeMap這一類的。以下簡單模擬一個數據結構的連環炮。
比如,面試官先問你HashMap是不是有序的?
你肯定回答說,不是有序的。那面試官就會繼續問你,有沒有有順序的Map實現類?
你如果這個時候說不知道的話,那這個問題就到此結束了。如果你說有TreeMap和LinkedHashMap。
那麼面試官接下來就可能會問你,TreeMap和LinkedHashMap是如何保證它的順序的?
如果你回答不上來,那麼到此為止。如果你依然回答上來了,那麼面試官還會繼續問你,你覺得它們兩個哪個的有序實現比較好?
如果你依然可以回答的話,那麼面試官會繼續問你,你覺得還有沒有比它更好或者更高效的實現方式?
如果你還能說出來的話,那麼就你所說的實現方式肯定依然可以問你很多問題。
以上就是一個面試官一步一步提問的例子。所以,如果你瞭解的不多,千萬不要敷衍,因為可能下一個問題你就暴露了,還不如直接說不會,把這個問題結束掉,趕緊切換到你熟悉的領域。
給大家推薦一個java內部學習群:725633148,進群找管理免費領取學習資料和視訊。沒有錯就是免費領取!大佬小白都歡迎,大家一起學習共同進步!
2、Java併發包當中的類,它們都有哪些作用,以及它們的實現原理,這些類就是java.concurrent包下面的。與上面一樣,咱們也簡單的模擬一個併發包的連環炮。
比如面試官可能會先問你,如果想實現所有的執行緒一起等待某個事件的發生,當某個事件發生時,所有執行緒一起開始往下執行的話,有什麼好的辦法嗎?
這個時候你可能會說可以用柵欄(Java的併發包中的CyclicBarrier),那麼面試官就會繼續問你,你知道它的實現原理嗎?
如果你繼續回答的話,面試官可能會繼續問你,你還知道其它的實現方式嗎?
如果你還能說出很多種實現方式的話,那麼繼續問你,你覺得這些方式裡哪個方式更好?
如果你說出來某一個方式比較好的話,面試官依然可以繼續問你,那如果讓你來寫的話,你覺得還有比它更好的實現方式嗎?
如果你這個時候依然可以說出來你自己更好的實現方式,那麼面試官肯定還會揪著這個繼續問你。
為什麼說面試的時候要引導面試官,原因就在這了。因為面試官的提問很多時候都是有跡可循的,你如果抓住了他的軌跡,能夠猜到他下面很可能會問什麼,那你在回答的時候就可以往你想要談的方向去說。這樣面試時就會顯得更加從容,更加的遊刃有餘。
3、IO包和NIO包中的內容。這部分裡面NIO會是重點,IO包大部分都會比較熟悉,因此可能會直接略過,直接問你NIO的內容。
IO包和NIO包的內容相對來說不是很多,首先NIO模型要熟悉,特別是其中的selector一定要非常清楚它的職責和實現原理。其實NIO的核心是IO執行緒池,一定要記住這個關鍵點。有的時候,面試官可能也會問你IO包的設計模式(裝飾器模式),為什麼要這樣設計?
有的面試官還會問你有沒有更好的設計,這個時候如果你不知道請果斷說自己現在的水平有限,想不出來更好的設計,千萬不要信口開河,隨意YY。
4、Java的虛擬機器的內容。這部分主要包括三部分,GC、類載入機制,以及記憶體。
一個GC部分簡單的連環炮。
面試官可以先問你什麼時候一個物件會被GC?
接著繼續問你為什麼要在這種時候物件才會被GC?
接著繼續問你GC策略都有哪些分類?
你如果說出來了,繼續問你這些策略分別都有什麼優劣勢?都適用於什麼場景?
你繼續說出來了以後,給你舉個實際的場景,讓你選擇一個GC策略?
你如果選出來了,繼續問你,為什麼要選擇這個策略?
下面是關於類載入機制的簡單連環炮。
首先肯定是先問你Java的類載入器都有哪些?
回答了這些以後,可能會問你每個類載入器都載入哪些類?
說完以後,可能會問你這些類載入之間的父子關係是怎樣的?
你在回答的時候可能會提到雙親委派模型,那麼可以繼續問你什麼是雙親委派模型?
你解釋完了以後,可能會繼續問你,為什麼Java的類載入器要使用雙親委派模型?
你回答完以後,可能會繼續問你如何自定義自己的類載入器,自己的類載入器和Java自帶的類載入器關係如何處理?
再來一個關於記憶體的連環炮。
首先肯定就是問你記憶體分為哪幾部分,這些部分分別都儲存哪些資料?
然後繼續問你一個物件從建立到銷燬都是怎麼在這些部分裡存活和轉移的?
接著可能會問你,記憶體的哪些部分會參與GC的回收?
完事以後,可能還會問你Java的記憶體模型是怎麼設計的?
你回答了以後,還會繼續問你為什麼要這麼設計?
問完以後,還可能會讓你結合記憶體模型的設計談談Volatile關鍵字的作用?
你在談的時候,肯定會提到可見性,那麼接著可見性這三個字,還可以繼續問你併發的內容。
額外的加分項
上面兩個階段基本上是必問的,還有一些加分項。這些加分項中,有些內容面試官也會問你(比如TCP/IP協議、演算法),但更多的是會先問你瞭解不瞭解,你瞭解的話再繼續聊,不瞭解的話就直接略過了,不至於因為這種問題而直接把你打入地獄。
列舉一些加分項:
1、計算機系統原理。
2、網路通訊協議(TCP/IP,HTTP等)。
3、資料結構與演算法。
4、著名開源專案的原始碼。
5、你自己有很棒的開源專案。
6、你的個人部落格。
7、待評論區補充。
這幾項當中,
對於前1-3項,如果你之前就比較瞭解,只是由於時間問題忘記了的話,還是可以臨時抱佛腳一下的。
至於後面4-6項,就需要你日常的積累了,不是一時半會兒能做到的。如果你平日裡沒有積累,那麼後面這三個加分項只能拋棄了。