2019 Android跳槽面試覆盤 今日頭條 有贊 親寶寶 塗鴉智慧 貝貝網
去大廠是每一個菜雞的心願,奈何大學水了四年,校招無緣。筆者從18年下半年開始準備社招,過程複雜坎坷,從18.12到19.3,面了很多公司,天幸最後被頭條收了。 如今對之前的整個歷程做一個覆盤,希望可以歸納出點收穫,也能對各位有所幫助。(部分面試相隔既久,題目不全,還望見諒)
-
總綱
- 準備過程與學習路線
- Android常見考點和複習重難點
- 1-3年階段的技術要求與準備策略
- 面試情況覆盤
- 常見問題踩坑指南。
1. 準備過程與學習路線
去年年中,本人蒐集了boss,拉鉤上BAT TMD相關的JD要求,混跡於各種面經帖,對相關要求進行了簡單歸納,在1-3年這個階段,基礎還是要夯實的,以前欠下的債該補的還是得補,繞不過去。整體來看,也是大家都能想到的幾塊知識。
- java基礎
- 資料結構與演算法。
- Android主體知識
- 常見框架原始碼瞭解。
- 網路基礎。
- 學習方法的問題,平時也不斷摸索了一些,事半功倍是不切實際的,做技術還是得踏下心來用做學問的態度,看書,寫程式碼,看原始碼。別無他法。 現在網上很多視訊資源,進階類的也不少,但是我不喜歡看。視訊的學習方式比較被動,進度是別人把控的,也會抑制自身的思考過程。短期感覺走了近路,但是很難達到預期效果。 一套視訊看下來n個小時,不管吸收多少,n個小時是浪費進去了。但是看書可以很快跳前跳後,內容銜接,知識量也更充足。 作為程式設計師,學知識還是要硬剛,放棄捷徑執念。
- 學習路線。像我這種學渣流,之前學校打的基礎不夠好,我建議第一步先從基礎做起。
- 第一步,計算機網路+java基礎+資料結構。 進行完本輪複習後,對後面學習網路框架,看第三方原始碼,系統原始碼路會順利很多。我們平時覺得用不到的東西,在原始碼裡會頻繁出現。
- 第二步,Android主體+ 常見框架原始碼。
- 第三步,演算法。 演算法之所以放在第三步,原因在於就客戶端社招而言很多公司不著重考察演算法,如果時間緊張可以靈活把握。 另一方面最後複習演算法,能最大程度上趁熱打鐵,練完即上陣。
- 推薦書目
-
計算機網路。《計算機網路原理》 正常強度複習一遍課本即可達到要求。
-
java基礎。
- 《java程式設計原理》刷一遍即可,對一些java層面的東西會有豁然開朗的感覺。
- 《java併發程式設計藝術》併發相關的技術原理,面試考察不突出,但是對知識體系的形成很有幫助。
- 《深入理解JVM虛擬機器》面試常客,垃圾回收演算法,垃圾收集器要足
夠熟練。 - 《Effective java》
-
資料結構《資料結構與演算法(java語言描述)》 著重瞭解java語言中的各種集合型別,以及常見的資料結構的概念。
-
Android主體知識
- 《Android核心剖析》 基於Android2.3版本,其特點在於剖析了framework層的主要流程,提綱挈領,利於建立整體的把握。
- 《深入理解Android核心》與上類同,但是不如核心剖析講的系統。可以對照來看。
- 《Android開發藝術探索》 這本比較有名。就不多說了。書好在對知識點的把握和提煉的比較好。但是深度上不應作為我們的目標。
- 《Android外掛化開發指南》包建強。 可以根據書中的外掛化的具體場景加深對framework層原理的理解。
- 《Android原始碼設計模式》設計模式方面這一本就夠了。如果對原始碼情景比較熟悉,可以速讀。
-
演算法知識
本人一開始是通過《資料結構與演算法(java語言)描述》來學習的,但是一大堆演算法推導公式看的頭昏腦脹,感覺效率並不高,本人建議直接leetcode刷題,leetcode上有專門針對各大廠的演算法題集錦,可以有針對性地分型別刷題。 基本上刷上二三十道,臨場再發揮一下就足夠應付大廠面試了,但是一定要堅持手寫程式碼培養感覺。
-
2. Android常見考點和複習重難點
下面是本人覺得比較重要的,必須要專門突破的考察重點。建議不只要當作題目去準備,前期可以當作專題,去準備一整塊的知識,越細越好。
- Handler原理, 對Handler,Message,Looper原始碼足夠熟悉,ThreadLocal,Message快取池的原理,執行緒間通訊的底層實現,延伸到HandlerThread,IntentService等非同步實現的比較。
- Binder原理, Binder的實現原理,不同IPC方式的比較。
- JVM虛擬機器垃圾回收機制,不同的回收演算法的使用場景,不同的垃圾回收器的特點。
- 類載入機制,雙親委派機制。
- Android效能優化,啟動優化,view優化, 記憶體優化 ,需要達到足夠的深度。而不是簡單瞭解,準備一些具體專案中的應用場景。
- MVC,MVP,MVVM架構各自的特點和在專案中的應用,最好延伸到Google官方的框架,並提前做一些預研。
- 幾個場景的程式碼流程,複述出其過程和原理。
- activity的啟動過程。兩個Activity生命週期的切換,ActivityThread與AMS的通訊過程,執行緒,程序,View的準備。Activity狀態儲存的時機和原理。 橫豎屏切換的過程。
- 應用的編譯打包過程。
- apk的安裝過程,冷啟動和熱啟動過程。
- java中new一個物件,其具體的流程細節。
- view的繪製過程。
- Android事件分發機制
- 自定義View
- 各種動畫的實現原理。
- ListView 的原始碼實現和快取機制。 RecyclerView的區域性重新整理和快取機制。
- 四種執行緒池和四種引用,各自的原理和應用場景。
- 兩種序列化方式及其原理。 需要深入理解。
- 網路原理,Http和Https的區別,UDP和TCP的區別。三次握手和四次揮手。 斷點續傳。Http報文結構和狀態碼。
- LRU演算法的具體應用。
- ArrayList,HashMap,LinkedList,ConcurrentHashMap, SparseArray,HashSet,TreeSet ,以上集合需要達到熟練程度。其他的自行了解。
- 推送,程序保活。程序的優先順序。
其他零碎的知識點不再列舉,以上是面試常問的點,建議不要看成題目去準備,而應該以點帶面,深入挖掘。
3. 畢業1-3年候選人的技術要求和準備策略。
之前在網上也搜過具體資料,相對而言,中小型公司1-3年的員工可能作為搬磚主力在用,而大廠更多在意的是這個階段的候選人的技術潛力,更傾向於尋找高潛選手。 那麼對於我們,努力的方向就是如何建立自己的高潛人設。
- 學歷,學歷不代表能力,但是是能力的證明。但是這個已無法改變。可以忽略。
- 技術部落格,GitHub。 這方面的意識越早越好,技術部落格既是自身知識的重塑輸出,另一方面也是自己的牌面。當時如果目前寫的不咋滴還是不建議拿出來。 其實不需要輸出太高深的東西,只要總結的好,有自己的見解和加工。也能側面反映出一個人的實力。
- 專案複雜度 這個方面可能會被忽視,很多人在公司寫業務,但是真到用的時候發現公司專案乏善可陳,簡單的有點拿不出手。 這方面要及早佈局,簡歷上需要有個複雜度足夠的拳頭專案,能代表你的技術最高水平。可以是自研的,也可以是公司的,甚至可以是公司裡別人的。只要你能百分百吸收為自己的東西。
- 技術廣度, 高潛的另一個特點是好奇心和求知慾。具體表現出來就是一個人的技術廣度,這需要平時的廣泛涉獵,掌握程度達到了解-熟悉即可。
即知識面足夠的情況下,有自己的拳頭專案,在某一個方向達到一定深度即可。 - 基礎 有些情況下,面試官會無意間考察你的基礎功底,社招不會著意去檢驗,但是某些地方可以很簡單判斷出一個人的功底如何。平時一些東西還是要慢慢去啃,有害無益。
4. 面試情況覆盤
剛開始會著意記錄一些公司的面試題目和過程,但是後來沒有堅持下來,有很多題目記不清了,只把一些想起來的補充出來。還有許多問題是基於專案來問的,沒辦法整理。另有一些公司的面試題都是重複的,所以只整理了一些有代表性的面試。
文末會給大家分享我整理的Android面試專題及答案(這些題我基本都刷了三遍以上,畢竟年前那波突然被裁心裡是有點迷)
貝貝網
貝貝網 電面 + 技術一面 + 技術二面 + leader 一面 + leader 二面 + Hr 面
貝貝網面數比較多,晚上下班跑過去面的,一直面到晚上十點多,效率很高,面試官比較nice,但是感覺整體氣氛上有點壓抑。效率很高,薪資上也還可以。第二天就給了offer。但是為了等後面更好的機會,offer沒有接。
具體面試題;
- 做一下自我介紹
- activity 啟動時View的流程
- resume時activity 是否完成了渲染
- 介紹一個元件化架構
- arouter的實現原理
- 垃圾回收機制。一個變數不用了什麼時候被回收。
- 雙親委託機制,如何打破雙親委託機制。
- 簡述handler機制,為什麼while迴圈不會造成oom。
- glide實現原理,有什麼出彩的點
- 是否看過原始碼,如何學習
- hashmap的擴容因子是做什麼的,每次擴容多少
- popwindow和dialog區別是什麼
- https的握手過程
- 如何看待公司加班的。
- 連結串列成環的判斷,手寫一下虛擬碼。
- java虛擬機器垃圾回收演算法。為什麼要進行分代回收。
有贊
有贊之前因為996搞得沸沸揚揚,但是本著學技術的態度,還是投了一下,年前投的,可能因為之前招聘已停,直到年後才開始約面。整體感覺還比較nice,面試官比較負責認真。同樣晚上面,本來預計分兩次面完,但是面完之後覺得時間還早就一次性搞定了。
電面 + 技術一面 + 主管二面 + HR面
- 類載入機制簡述,
- 物件初始化過程
- webview的記憶體洩漏是否瞭解。
- Js與原生之間的互動有幾種,有什麼不同和優缺點。Js在之前版本的安全漏洞是否瞭解,如何避免,為什麼會有這個漏洞。
- 如何判讀連結串列成環,如何找到入環的點。
- 不同執行緒之間是如何進行同步的。
- 最熟悉哪個框架,簡單講一下你對okHttp理解。
- 雙親載入機制,有什麼辦法可以打破
- activity切換時,兩個activity的生命週期變化,
- 專案的整體結構,元件間通訊如何實現,Arouter原理
- 元件間通訊除了Arouter還有什麼其他實現方式,如何實現互相呼叫。
- 專案中元件間的依賴關係是如何演進的。
- gradle分渠道打包是否熟悉。
- HashMap原理,如何解決hash衝突,除了這種方式還有其他的方式嗎。
- SparseArray與HashMap區別,他的優點是什麼。
- LinkedList和ArrayList區別。各自的優缺點。迭代器實現篩選。
- 專案中用的是哪種序列化方式,為什麼要用這一種,除了他們的原理不同,還有哪些考量。
今日頭條
頭條的面試比較偶然,本來準備試一下其他的幾個大廠,但是今年裁員比較嚴重,大廠社招的title也比較高,1.5年的菜雞基本沒給啥機會。頭條相對來講還是比較喜歡年輕人的。 一個獵頭朋友介紹的機會,沒想到竟然意外約面並拿到了offer,如夢一般。
技術一面 + 二面 + 三面 + Hr面(題目排序不分先後,想到哪個寫哪個)
- 說一下對MVC MVP MVVM的理解,以及MVVM的實現方式有哪些。
- Retrofit是否有過了解,是否瞭解其動態代理的實現。
- 專案中用的代理是如何實現的,只能在java層做代理嗎。
- 目前Android中常見的應用雙開,系統是如何實現的。
- 目前Android中常見的雙系統,是如何實現的。 又沒有了解過。
- Android中一屏展示兩個應用,那實現這個效果,你覺得framework層需要做哪些修改。
- 假如讓你設計Binder機制中兩個程序的通訊協議,你有什麼思路嗎。
- 如果讓你用程式碼實現.9圖的伸縮過程,你有什麼思路。
- HashMap版本變化和原理。hashcode的實現方式,hash衝突如何解決,查詢時如何查詢的。
- java中常見的ArrayList是否執行緒安全,如何讓它變的執行緒安全。系統提供的方法實現執行緒安全本質上是如何做到的。
- 簡述Java的記憶體模型
- JVM記憶體回收時有沒有辦法監聽,如何解救,解救過後finalize方法是否每次都會呼叫。
- 你在專案中做了哪些效能優化。
- 當時做這個框架時是基於哪些考慮。 有沒有去做具體的技術選型和其他技術方案的參考。
- Application可以做Activity生命週期的回撥,為什麼還要通過反射去實現,如何考量的。
- 自定義view時draw()和onDraw()方法有什麼區別。
- 是否瞭解onSavedInstanceState方法,滅屏時是否會觸發。 OnRestoreInstanceState與其總是成對出現的嗎,說一下你的理解。
- 講一下Android的動畫原理。
- rxjava是否瞭解,說一下你的理解,你在專案中用到的哪些比較多。floatMap和Map呢。執行緒切換的原理是否瞭解。
- ConcurrentHashMap的原理是什麼。
- View的繪製流程。
- 你覺得上一面面試怎麼樣,有哪些沒有答好
- 面試中的演算法題,每面最後都要進行1-2個手寫演算法。
-
- 完全二叉樹的遍歷,每一行從左到右遍歷的。變種,波浪形遍歷,在原來的基礎上修改最少的程式碼實現。
- 2.被旋轉過的有序陣列,給你一個數,返回在陣列中的位置。
-
- 一副牌,用最快的速度將他們打亂順序,要求隨機。你能否想出儘可能多的策略。
-
- 一個無序陣列,負數正數和0,尋找其中兩個數,使之和的絕對值最小。
- 4.在一群人中兩兩互不認識,但是都認識明星,找出哪一個是明星。
-
5. 常見問題踩坑指南
- 關於為什麼離職,最穩妥的方式是說為了技術發展。當然面大廠的話,不需要理由的,人人都想去大廠。 但是其他的理由能不扯還是儘量不扯。
- 跟HR談薪不可太急。大廠走流程一般計較慢,有幾家公司筆者因為心裡沒底,問的太頻繁,被HR壓價。只要拿到口頭offer,一般不會出什麼問題,一定要端著。
- 留好下家,雖然理論上拿到口頭 offer,被放鴿子的概率比較低,但是對於HR的話是不可信的,一切以書面為準,對於備用offer,能拖則拖,不能拖先入職也可。筆者以為拖黃了,導致在等頭條offer的時候等了很久,心力交瘁,沒有退路。
- 功夫下在平時,技術人員的內功在面試時是裝不出來的, 面試官會著重考察。知識點繁多,任何一點擴充套件開去都需要很多時間才能掌握。臨時抱佛腳很難通過。
END
好了,在文章最後放上一個小小的福利,以下為小編自己在學習過程中整理出的一個學習思路方向及大廠面試專題及答案,需要的參照下面的領取方式。從事網際網路開發,畢竟最主要的是要學好技術,而學習技術是一條慢長而艱苦的道路,不能靠一時激情,也不是熬幾天幾夜就能學好的,必須養成平時努力學習的習慣,更加需要準確的學習方向達到有效的學習效果。
由於內容較多就只放上一個大概的大綱,需要更及詳細的學習思維導圖的加群Android IOC架構設計免費獲取。
群內還有免費的高階UI、效能優化、架構師課程、NDK、混合式開發(ReactNative+Weex)微信小程式、Flutter全方面的Android進階實踐技術資料,並且還有技術大牛一起討論交流解決問題。
領取方式:
點贊+加群免費獲取Android IOC架構設計


