前言
2020年遲來的春招面經,望能給2021年即将準備春招面試的小夥伴進行查考。
阿裡的面試一般采用電話面試的形式,筆者一共參加五輪面試,一面電話面試+線上程式設計,二面視訊面試+線上程式設計,三面部門boss面試,四面交叉面,五面HR。在此分享五輪面試的大概問題吧,筆者是android崗開發,所問題型會更偏android。
一面
阿裡的面試官都很和藹。一面面試官聽聲音感覺應該是入職兩三年的感覺。上來自我介紹後直接開始問android相關問題。
大概問題如下:
- android中的dp、px、dip相關概念
- handler機制,四個組成部分及源碼解析
- 布局相關的、控件作用及實作原理
- android中的布局優化
- relativelayout和LinearLayout在實作效果同等情況下選擇使用哪個?為什麼?
- view的工作原理及measure、layout、draw流程,要求了解源碼
- 怎樣自定義一個彈幕控件?
- 如果控件内部卡頓你如何去解決并優化?
- listview的緩存機制
- Invalidate、postInvalidate、requestLayout應用場景
- 多線程,5個線程内部列印hello和word,hello在前,要求提供一種方法使得5個線程先全部列印出hello後再列印5個word。
實作一個自定義view,其中含有若幹textview,textview文字可換行且自定義- - view的高度可自适應拓展
- 程式設計題:将元素均為0、1、2的數組排序。在手打了一種直接周遊三種數目并列印的方法後讓手寫實作,手寫實作後讓再說一種穩定的方法,說了一種通過三個下标周遊一遍實作的方法,讀者可自行百度,在此不贅述。
一面面完挺懵的,感受到阿裡校招的火力,阿裡的要求程度高于“知道、會用”那一層,你需要了解底層原理、機制才能過關。一面50min。
一面面完,面試官說需要回報面試過程後才能知道是否通過,後來了解到阿裡的一面是“履歷篩選”面,刷人不會太多。自我感覺良好,總體答出大概百分之八九十,面完便好好準備二面了。
二面
二面很重要,二面很重要,二面很重要。二面對于你是否能通過面試,是否能最終從池子中被撈出來都很重要。一面面完的第二天下午收到來自杭州的電話,約了晚上九點的時間,且通知了視訊面試和線上程式設計。
一陣慌張……看了那麼多面經,沒見過誰連續兩次程式設計的……晚上九點,準時登入視訊網址後,面試官已經線上。二面面試官稍顯嚴肅,給人感覺非常嚴謹。上來簡單自我介紹後,他說一面評價比較好,他會面試得細緻一點,可能時間會稍長。當時心神一緊,做好了鏖戰的準備。二面問的内容非常多,且覆寫範圍很廣,大概問題如下:
JVM方面
- java記憶體模型,五個部分,程式計數器、棧、本地棧、堆、方法區。
- 每個部分的概念、特點、作用。
- 類加載的過程,加載、驗證、準備、解析、初始化。每個部分較長的描述。
- 加載階段讀入.class檔案,class檔案時二進制嗎,為什麼需要使用二進制的方式?
- 驗證過程是防止什麼問題?驗證過程是怎樣的?加載和驗證的執行順序?符号引用的含義?
- 準備過程的靜态成員變量配置設定空間和設定初始值問題。
- 解析過程符号引用替代為直接引用細節相關。
- 初始化過程jvm的顯式初始化相關。
- 類解除安裝的過程及觸發條件。
- 三種類加載器,如何自定義一個類加載器?
- 雙親委派機制。
- JVM記憶體配置設定政策,優先放于eden區、動态對象年齡判斷、配置設定擔保政策等。
- JVM垃圾回收政策,怎樣判對象、類需要被回收?
- 四種垃圾回收算法标記-清除、複制、标記-整理、分代收集。
- JVM中的垃圾回收器,新生代回收器、老年代回收器、stop-the-world概念及解決方法。
- 四類引用及使用場景?
基本上JVM方面所有的大的概念全部問到,真的需要了解到位。JVM比較熟悉,全程巴拉巴拉不停地說,有驚無險。
集合類
初始引起話題的問題:hashmap了解嗎?心中一喜,開啟侃侃而談(胡吹)模式。講到了以下的一些點:
- hashmap實作的資料結構,數組、桶等。
- hashmap的哈希沖突解決方法:拉鍊法等。拉鍊法的優缺點。
- hashmap的參數及影響性能的關鍵參數:加載因子和初始容量。
- Resize操作的過程。
- hashmap容量為2次幂的原因。
講完一通之後,面試官挺滿意,說了解地比較深挺好,抛出了下一個問題hashtable了解嗎?又是心中一喜,一通介紹:
- hashtable線程安全、synchronized加鎖。
- hashtable和hashmap異同。
- 為什麼hashtable被棄用?
果斷将話題扯到concurrenthashmap,講了concurrenthashmap相比于hashtable做的優化、segment的概念、concurrenthashmap高效的原因。中間面試官問的問題:
- 容器類中fastfail的概念。
- concurrenthashmap的插入操作是直接操作數組中的連結清單嗎?
- 集合類相關over,由于都是自己主動在說,把握了主動權,相談甚歡。
多線程
由于上面提出了concurrenthashmap的概念,順理成章聊起了多線程。有了上一部分的經驗全程我主動講,面試官針對性問了一些問題,大概内容如下:
- 為什麼要使用多線程?多線程需要注意的問題。上下文開銷、死鎖等。
- java記憶體模型、導緻線程不安全的原因。
- volatile關鍵字,緩存一緻性、指令重排序概念。
- synchronize關鍵字,java對象頭、Markword概念、synchronize底層monitorenter和moniterexit指令。
- lock語句和synchronize對比。
- 原子操作,CAS概念、相關參數。
- 樂觀鎖、悲觀鎖概念及使用場景。
- 線程池概念、實作原理等。
- JVM鎖的優化,偏向鎖、輕量級鎖概念及原理。
多線程方面回答得比較好,面試官回報比較滿意。
資料庫
資料庫方面筆者水準較菜,沒有深入了解。面試官問了一個問題,
- SQL語句中對表或者字段取别名有什麼好處?
并不知道怎麼回答,面試官也沒有再問資料庫相關。之後面試官問了解作業系統,回答:沒學過。面試官:好的 ,那不問了。心中感動得無法用言語形容。
通信協定
接下來是對通信協定的了解,大概問了下列問題:
- TCP三向交握、四次揮手。
- http請求封包結構、響應封包,狀态碼。
- http2.0相比于http1.0的新特性,推送、多路複用、消息頭壓縮等。
通信協定問得不是太深,了解得比較好即可。面試官回報比較好。最後就是問android了,面試官說感覺你android應該挺厲害的,當時真的是受寵若驚。
android
android是重頭戲。由于之前已經了解挺多,android方面基礎的沒有多問,比較深入。大概有如下問題:
- handler機制組成,handler機制每一部分的源碼包括looper中的loop方法、threadlocal概念、dispatchmessage方法源碼,runnable封裝message等。
- listview緩存機制、recycleview緩存機制。
- bitmap高效加載,三級緩存等。
- binder機制原理。
- view的工作原理及measure、layout、draw流程。哪一個流程可以放在子線程中去執行?
- draw方法中需要注意的問題?
- view的事件分發機制。
- android性能優化:布局優化、繪制優化、記憶體洩露優化、bitmap、記憶體洩露等。
- 記憶體洩露的概念?android中發生的場景?怎麼解決?講了handler、動畫等。
面試android方面的時候已經真正地淡定下來了,有條不紊地和面試官說了自己所有的了解。回報也挺好。
算法
最後是一題線上程式設計,題目比較正常,是一題最大連續子序列,需要注意全是負數的處理,在此不贅述可自行百度。
寫算法的時候發生了一個小插曲,由于面試官直接面的都是以java寫的,而筆者比較熟悉C++寫算法,面試官也不太熟悉c++編譯(g++),面面相觑一會兒才成功編譯輸出結果。真心非常感謝二面面試官的細緻和耐心,最好的一次面試體驗。面試官說他的這一面他過了,還會有一到兩輪技術面試,禮貌地感謝面試官之後結束了,至此二面結束。二面108min。關閉連接配接後長呼一口氣和女友分享了喜報,經此一役,我知道我的阿裡之路已走完半程。
為什麼說二面很重要呢?因為二面是是以技術面試中最為細緻、考察最為最為深入的一輪面試,後面的面試官會很大程度上參考這一面試的結果,并且據說這一面很影響評級。
三面
二面過後的第二天下午收到三面電話,約了三點的面試,由于之前的面試都是晚上可以在教室完成(在此感謝女友,沒有你的陪伴就沒有一個好的環境完成面試),三點的時間點是上課時間也基本找不到空教室,是以在教師休息的小房間完成了三面面試。
三面面試官感覺是部門主管級别,上來自我介紹後開始問問題。問了一下履歷上在學校做的一個android的項目,說一個難點,講了推送,巴拉巴拉講了一通極光推送,感覺面試官不是很感冒,問了極光推送的實作原理,筆者一緊張竟然忘了講長連接配接……又問了華為實習的項目,難點,怎麼優化……我扯了一通字母樹,感覺面試官還是不太感冒。這個時候已經有點慌張,然後……面試官開始問優缺點、之前簽的公司、為什麼想去杭州、你是怎麼看待算法?還問了最優成就感的一件事情,你覺得為什麼會獲得一等獎?是不是因為對手太弱了(懵了……)?回答完直接問還有什麼問題想問他…此時有點崩潰,感覺也答得不太好,問了還有哪些方面需要改善。然後結束了面試……三面29min。
面完三面挺難受的,感覺回報不是很好,沒發揮好。難過了一會兒吃了個飯回圖書館繼續看書。
四面
當晚上我還在感懷阿裡離我遠去的時候,一個杭州的電話來了……和四面面試官約好了時間,做一個技術和綜合素質方面的面試。急匆匆和女友去找到了一個空教室,9點電話如約而至。四面面試官感覺斯文儒雅,上來介紹這是一輪交叉面,最後一輪技術面試。照例自我介紹後,問了如下問題:
通信協定
TCP保證可靠傳輸的實作:停止等待協定、滑動視窗協定、流量控制、擁塞控制等。
項目
- 說一個你記憶比較深刻的功能:我講了一個檢視目前WiFi網絡連接配接終端資訊的功能的實作。
- 說一下你遇到的問題:講了一個十幾萬級别的字元串的比對通過字母樹優化的問題。面試官聽了後和我詳細分析了一下,得到了一個更好的實作方法……當時一陣汗顔,班門弄斧了。
- 問了一下項目中使用到的三級緩存政策。
獲獎
聊了聊獲獎經曆,中間是怎麼學習的。面試官看了看前面的面試過程,說問了多線程了,那他就不問了……
資料庫
資料庫方面問了以下的問題:
- 索引的種類。
- B樹、B+樹、紅黑樹。
- B+樹和B樹相比有什麼優點,應用場景?
- 紅黑樹的一些特點?怎樣保持平衡?
問着資料庫,問着問着扯到資料結構那邊去了……說完之後面試官是感覺你這些都有所準備啊,我說對,畢竟是面阿裡,面試官笑了說我本來還準備問你一下八大排序的現在感覺你應該都會,我很自信(jian zha)地說對,我都會。至此,面試官說技術方面他沒什麼問題想問的了,他這是一輪交叉面,集團内部要求的,他是背景開發方面的,不懂android,問我還有什麼想問的。筆者抛出了萬金油問題,您覺得我還有哪些方面需要優化的。面試官哈哈一笑,說你們這些學生現在問的都是套路問題,他基本上回答的都是這個問題,然後說了一通感覺深度和廣度都有,繼續保持就好了。
四面48min。至此,筆者徹底放心。互道周末愉快後結束了面試。和女友分享喜報後,阿裡之路的進度條已經走到80%了。至于為什麼有交叉面,衆說紛纭,不太清楚。
五面(HR)
度過周末後照例去圖書館學習,在周一下午接到hr的電話。周末準備了一些常見的HR面試問題,結果一個都沒問到,問到的問題大概如下:
- 關于之前一次筆試的程式設計題,為什麼沒有做出來?後來有思考過嗎?
- 你簽約的公司給的薪水是怎麼樣的?如果阿裡給你offer,你是怎麼考量這兩個offer的?
- 為什麼沒有在之前實習的公司留下來?之前公司的主管是怎麼評價你的?
- 你的優缺點?
最後日常問問題,萬金油問題培養體系和晉升機制。面完告知一到兩周會有結果,要從池子裡綜合考量撈出一批人給offer(心中一慌,畢竟走到最後的對手都不容小觑)。随後HR面試官加了微信,有問題可以在微信上交流。
後續
面完HR安心地在備胎池裡面躺着。等待的日子總是很難熬,一天一天地過去,各種打聽消息,聽說有的前幾批的拿到了意向(offer),心裡拔涼拔涼。在過去四天後,周五的下午問了HR面試官後得知offer已在審批,據說比較穩,就是走個流程。聯想到之前面完騰訊hr在offer審批等了很久還是心難安,在熬過周末,周一和周二,offer已經審批了三天,焦慮程度與日俱增。周二晚上十點半的時候,在宿舍無聊重新整理聞的時候,突然收到一條短信和一封郵件,打開後發現是錄用意向書。
真的挺開心,長呼一口氣,總算這條路走到了盡頭。
以上是我的阿裡春招之路的分享。
總結
洋洋灑灑寫到這邊已經說了很多,也有一些經驗和大家分享。從19年春招找實習到20年春招,找工作的日子真的很累,不過再累也要堅持。有幸參加過一些公司的面試,問的問題也都大同小異,主要是以下的一些方面:
- java基礎
- 集合類
- 多線程
- JVM虛拟機
- 通信協定
- 資料庫
- 作業系統
- 算法
- 你的技術方向
- 項目
一些感慨
說一些個人感受吧,找工作其實很容易,一些公司單憑學曆就可以讓你進去上班,現在太缺程式員了,簡單到你面試根本不聊技術談談人生、聊聊獎項就可以給你發offer,但是找一個好工作不易,數十上百個人搶一兩個崗位很常見。
主要你怎麼定義你對于“好”的了解,工資高?公司技術氛圍好?行業地位高?工作安穩福利好?不加班?仁者見仁智者見智,沒必要強行拿自己的價值觀去評判别人的工作,最适合的才是最好的。是以在找工作的時候想清楚自己到底想要一個怎樣的工作也是挺重要的,定義一個目标,努力去做,才是最重要的。
技巧小談
關于面試的一些技巧,個人覺得最根本的還是拓展你的知識架構的寬度和廣度,形成你的一套說辭架構。以多線程為例,問到你多線程?可以先從為什麼要使用多線程?使用多線程有什麼好處?使用多線程一定會比單線程好嗎?多線程會導緻什麼問題?導緻問題的java記憶體模型是怎樣的?怎麼解決這個問題?解決方法如volatile、synchronize關鍵字等它的底層實作是怎樣的?你是怎麼使用多線程的?使用線程池有什麼好處……
如果你真正了解了并将它完善成一個體系,面試官讓你說多線程,接下來10min,你可以一直講完。面試的參照不是你和面試官相比如何,而是你和你的競争者相比如何,如果上面這一套完善地講完,面試官對你的評價可想而知。
最後
我将自己以往的一些面試題與學習筆記進行了整理,由于文章篇幅長度有限,我就不一一展現出來了,大家可以加入粉絲裙:872206502進行擷取。
【Android核心進階技術PDF文檔,BAT大廠面試真題解析】
【算法合集】
【延伸Android必備知識點】