阿裏春招Android面經
作者:淘萄桃
鏈接:
https://www.jianshu.com/p/a07ccaad832d
本文由作者授權發布。
筆者參加18年阿裏春招,有幸最終拿到阿裏offer,base杭州,崗位客戶端開發。一直忙於其他事情,拿到意向已經過去十多天,在此分享一些關於面試的幹貨,攢一波RP,回饋社會。
從阿裏面試說起,阿裏的面試一般采用電話面試的形式。筆者一共參加五輪面試,一面電話面試+在線編程,二面視頻面試+在線編程,三面部門boss面試,四面交叉面,五面HR。在此分享五輪面試的大概問題吧,筆者是android崗開發,所問題型會更偏android。
1一面
阿裏的面試官都很和藹。一面面試官聽聲音感覺應該是入職兩三年的感覺。上來自我介紹後直接開始問android相關問題。
大概問題如下:
-
android中的dp、px、dip相關概念
-
handler機制,四個組成部分及源碼解析
-
布局相關的<merge>、<viewstub>控件作用及實現原理
-
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。
一面面完,面試官說需要反饋面試過程後才能知道是否通過,後來了解到阿裏的一面是“簡歷篩選”面,刷人不會太多。自我感覺良好,總體答出大概百分之八九十,面完便好好準備二面了。
2二面
二面很重要,二面很重要,二面很重要。二面對於你是否能通過面試,是否能最終從池子中被撈出來都很重要。一面面完的第二天下午收到來自杭州的電話,約了晚上九點的時間,且通知了視頻面試和在線編程。
一陣慌張……看了那麽多面經,沒見過誰連續兩次編程的……晚上九點,準時登錄視頻網址後,面試官已經在線。二面面試官稍顯嚴肅,給人感覺非常嚴謹。上來簡單自我介紹後,他說一面評價比較好,他會面試得細致一點,可能時間會稍長。當時心神一緊,做好了鏖戰的準備。二面問的內容非常多,且覆蓋範圍很廣,大概問題如下:
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。關閉連接後長呼一口氣和女友分享了喜報,經此一役,我知道我的阿裏之路已走完半程。
為什麽說二面很重要呢?因為二面是所以技術面試中最為細致、考察最為最為深入的一輪面試,後面的面試官會很大程度上參考這一面試的結果,並且據說這一面很影響評級。
3三面
二面過後的第二天下午收到三面電話,約了三點的面試,由於之前的面試都是晚上可以在教室完成(在此感謝女友,沒有你的陪伴就沒有一個好的環境完成面試),三點的時間點是上課時間也基本找不到空教室,所以在教師休息的小房間完成了三面面試。
三面面試官感覺是部門主管級別,上來自我介紹後開始問問題。問了一下簡歷上在學校做的一個android的項目,說一個難點,講了推送,巴拉巴拉講了一通極光推送,感覺面試官不是很感冒,問了極光推送的實現原理,筆者一緊張竟然忘了講長連接……又問了華為實習的項目,難點,怎麽優化……我扯了一通字母樹,感覺面試官還是不太感冒。這個時候已經有點慌張,然後……面試官開始問優缺點、之前簽的公司、為什麽想去杭州、你是怎麽看待算法?還問了最優成就感的一件事情,你覺得為什麽會獲得一等獎?是不是因為對手太弱了(懵了……)?回答完直接問還有什麽問題想問他…此時有點崩潰,感覺也答得不太好,問了還有哪些方面需要改善。然後結束了面試……三面29min。
面完三面挺難受的,感覺反饋不是很好,沒發揮好。難過了一會兒吃了個飯回圖書館繼續看書。
4四面
當晚上我還在圖書館感懷阿裏離我遠去的時候,一個杭州的電話來了……和四面面試官約好了時間,做一個技術和綜合素質方面的面試。急匆匆和女友去找到了一個空教室,9點電話如約而至。四面面試官感覺斯文儒雅,上來介紹這是一輪交叉面,最後一輪技術面試。照例自我介紹後,問了如下問題:
通信協議
TCP保證可靠傳輸的實現:停止等待協議、滑動窗口協議、流量控制、擁塞控制等。
項目
-
說一個你記憶比較深刻的功能:我講了一個查看當前WiFi網絡連接終端信息的功能的實現。
-
說一下你遇到的問題:講了一個十幾萬級別的字符串的匹配通過字母樹優化的問題。面試官聽了後和我詳細分析了一下,得到了一個更好的實現方法……當時一陣汗顏,班門弄斧了。
-
問了一下項目中使用到的三級緩存策略。
獲獎
聊了聊獲獎經歷,中間是怎麽學習的。面試官看了看前面的面試過程,說問了多線程了,那他就不問了……
數據庫
數據庫方面問了以下的問題:
-
索引的種類。
-
B樹、B+樹、紅黑樹。
-
B+樹和B樹相比有什麽優點,應用場景?
-
紅黑樹的一些特點?怎樣保持平衡?
問著數據庫,問著問著扯到數據結構那邊去了……說完之後面試官是感覺你這些都有所準備啊,我說對,畢竟是面阿裏,面試官笑了說我本來還準備問你一下八大排序的現在感覺你應該都會,我很自信(jian zha)地說對,我都會。至此,面試官說技術方面他沒什麽問題想問的了,他這是一輪交叉面,集團內部要求的,他是後臺開發方面的,不懂android,問我還有什麽想問的。筆者拋出了萬金油問題,您覺得我還有哪些方面需要優化的。面試官哈哈一笑,說你們這些學生現在問的都是套路問題,他基本上回答的都是這個問題,然後說了一通感覺深度和廣度都有,繼續保持就好了。
四面48min。至此,筆者徹底放心。互道周末愉快後結束了面試。和女友分享喜報後,阿裏之路的進度條已經走到80%了。至於為什麽有交叉面,眾說紛紜,不太清楚。
5五面(HR)
度過周末後照例去圖書館學習,在周一下午接到hr的電話。周末準備了一些常見的HR面試問題,結果一個都沒問到,問到的問題大概如下:
-
關於之前一次筆試的編程題,為什麽沒有做出來?後來有思考過嗎?
-
你簽約的公司給的薪水是怎麽樣的?如果阿裏給你offer,你是怎麽考量這兩個offer的?
-
為什麽沒有在之前實習的公司留下來?之前公司的主管是怎麽評價你的?
-
你的優缺點?
最後日常問問題,萬金油問題培養體系和晉升機制。面完告知一到兩周會有結果,要從池子裏綜合考量撈出一批人給offer(心中一慌,畢竟走到最後的對手都不容小覷)。隨後HR面試官加了微信,有問題可以在微信上交流。
6後續
面完HR安心地在備胎池裏面躺著。等待的日子總是很難熬,一天一天地過去,各種打聽消息,聽說有的前幾批的拿到了意向(offer),心裏拔涼拔涼。在過去四天後,周五的下午問了HR面試官後得知offer已在審批,據說比較穩,就是走個流程。聯想到之前面完騰訊hr在offer審批等了很久還是心難安,在熬過周末,周一和周二,offer已經審批了三天,焦慮程度與日俱增。周二晚上十點半的時候,在宿舍無聊刷新聞的時候,突然收到一條短信和一封郵件,打開後發現是錄用意向書。
真的挺開心,長呼一口氣,總算這條路走到了盡頭。
以上是我的阿裏春招之路的分享。
7總結
洋洋灑灑寫到這邊已經說了很多,也有一些經驗和大家分享。從17年春招找實習到18年春招,找工作的日子真的很累,不過再累也要堅持。有幸參加過一些公司的面試,問的問題也都大同小異,主要是以下的一些方面:
-
java基礎
-
集合類
-
多線程
-
JVM虛擬機
-
通信協議
-
數據庫
-
操作系統
-
算法
-
你的技術方向
-
項目。
關於每個方面的復習後續會給出分享。
一些感慨
說一些個人感受吧,找工作其實很容易,一些公司單憑學歷就可以讓你進去上班,現在太缺程序員了,簡單到你面試根本不聊技術談談人生、聊聊獎項就可以給你發offer,但是找一個好工作不易,數十上百個人搶一兩個崗位很常見。
主要你怎麽定義你對於“好”的理解,工資高?公司技術氛圍好?行業地位高?工作安穩福利好?不加班?仁者見仁智者見智,沒必要強行拿自己的價值觀去評判別人的工作,最適合的才是最好的。所以在找工作的時候想清楚自己到底想要一個怎樣的工作也是挺重要的,定義一個目標,努力去做,才是最重要的。
技巧小談
關於面試的一些技巧,個人覺得最根本的還是拓展你的知識架構的寬度和廣度,形成你的一套說辭架構。以多線程為例,問到你多線程?可以先從為什麽要使用多線程?使用多線程有什麽好處?使用多線程一定會比單線程好嗎?多線程會導致什麽問題?導致問題的java內存模型是怎樣的?怎麽解決這個問題?解決方法如volatile、synchronize關鍵字等它的底層實現是怎樣的?你是怎麽使用多線程的?使用線程池有什麽好處……
如果你真正理解了並將它完善成一個體系,面試官讓你說多線程,接下來10min,你可以一直講完。面試的參照不是你和面試官相比如何,而是你和你的競爭者相比如何,如果上面這一套完善地講完,面試官對你的評價可想而知。
終章
我的csdn鏈接
https://blog.csdn.net/qq_26071477
CSDN排版實在接受不了了,轉戰簡書。
簡書第一篇文章,求職不易,祝大家都能拿到心儀的offer。
阿裏春招Android面經