我所經歷的Android面試

概述

筆者15年畢業一直在小公司,以爲徹底靠自學已經到了本身的天花板,而後想進大型互聯網公司發展,因此年前辭職,放棄了年終獎,年後就直接來的北京,面試的公司有穩定的大公司,也有創業型公司,有些創業型的公司面試質量也挺高的,不輸於一些大公司,下面會說到。前端

技術儲備

基礎

無論是Android基礎仍是Java基礎以及常見的數據結構,這些是無原則地必需要熟練掌握的,尤爲是非計算機專業的同窗,面試官一上來確定是問你基礎,要是基礎表現很差很容易被扣上基礎不紮實的帽子,常見的就那些,只要你平時認真思考過基本上面試是沒太大問題的。java

算法

基本上每家公司都會有算法題,我當時是看了左程雲的《程序員代碼面試指南》,重點看了數組跟鏈表,二叉樹沒有去刷算法題,對於二叉樹的掌握在於三種基本的遍歷以及在排序算法中堆排序中用到的二叉堆,而後每道算法題都先本身去實現,先寫思路,而後本身去實現一遍,而後再看看答案,記住答案的思路,次日再從新按照答案的思路實現一遍,這種效果很是好,我沒有去刷不少題目,而是想經過這種方式去分析常見的算法題,因此我不大建議去刷算法題,首先做爲客戶端開發,涉及不到不少的算法,第二,面試的時候考的算法大部分都是很基本的數組組跟鏈表構成的,最後算法這個東西是個無底洞,我的以爲不必去刷題,刷題可能對小公司有用,可是大公司更看重你解決問題的能力。python

虛擬機

  • JVM

對於Java,加載的是Class文件,通常會問到Java運行時的內存分配,類加載機制以及GC,實際上後面兩個問地比較多,尤爲是GC相關,每每結合四種引用出題,最後會經過這個來引出內存泄露相關的一些問題。android

  • DVM&ART

Android的虛擬就DVM以及ART是對JVM作了一些優化,加載的是dex文件,對Class字節碼作了一些優化,這個裏面其實挺複雜的,我只知道一些基本的概念。程序員

  • ClassLoader

這個其實要是問起來實際上是有不少東西的,若是是Java相關其實還好,會問你類加載機制,可是Android裏面除了Java的類加載機制以外,還會引出插件化跟熱修復。面試

JNI

基本上稍微大點的公司都會問到,不過個人回答始終如一:我只能看懂C的代碼,項目中沒有用過JNI,固然這個屬於加分項,由於我當時的選擇是把我用過熟悉的東西研究地倒背如流,而不是在本身平時不多接觸到的東西上面搞個只知其一;不知其二。算法

Binder

Binder系列,各類AMS,WMS,PWS,常問到的有APP的啓動流程,而後兩個Activity相互跳轉的時候的生命週期,Activity的生命週期。數據庫

心態

不要想着什麼都會,那樣不現實,好比說我對Binder機制以及熱修復,插件化這塊兒確實瞭解地比較淺顯,也跟高德,愛奇藝等公司的面試官聊過這個話題,這些屬於加分項,不會影響到最終的面試結果,還有就是算法,面試最多考一道或者兩道算法,因此不必在這方面花太多的時間,掌握好常見的數組跟鏈表,二叉樹/堆了解一下,基本就夠了,公司看重的是你解決問題的能力,你把原理掌握好,常見地基本上都沒什麼問題。設計模式

當你基礎知識OK,本身用過的東西的理解地有深度,解決問題的能力OK,若是面試官想要你,那麼他會去找你的優勢,反之他會去找你的缺點。因此若是你想進某家公司,那麼你就按照他們的要求去面,就算面不上那麼也沒什麼,只能說不合適,而後查漏補缺繼續面,不要由於某一次或者幾回的不順就否認本身,有些公司的面試官就是喜歡裝,並且仍是大公司的。數組

學歷很重要,個人學校只是個普通本科,相對通常,因此投了不少知名互聯網公司簡歷都過不了,就連好大夫在邀請我面試的時候特地問了我是否是統招一本,任何行業都看重學歷,不只僅是IT,那些說學歷不重要的基本上都是一些學歷比較好的或者是在Android比較火地那個階段開始搞地Android,他們這批人每每會以爲在03年跟18年加入的阿里的難度是同樣的,那些以爲學歷不重要的能夠去看看張雪峯老在《演說家》中的演講,不要說什麼3年之後公司就不看學歷了,學歷是一生的事情,那些高考可以碾壓你的人,出了社會只要他們願意,照樣能碾壓你,你努力,你拼命,別人也不會睡大覺等你。

科班很重要,若是你本科學地是非計算機專業,任何一個面試官或者HR都會認爲你基礎不行,你須要花不少的時間去精力去補基礎,而後再花時間跟精力在HR不Pass掉你簡歷的狀況下摘掉基礎不行這頂帽子。

工做背景很重要,若是你有大公司背景給你背書,相同的崗位,你進入的門檻比有大公司背景的人要高地多,若是你有大公司背景,無論是面試官仍是HR都會在你面試前給你打一個較高的基本分,這個是頗有利於你經過面試的。

不過上面都是既定的事實,你無法改變,因此當我意識到這些問題的時候,我只能去不斷地提高本身的能力,去花更多地代價去得到一個面試機會,去證實本身的能力進而進入到一個比較好的平臺。

面試公司

火幣網

面試機會來自於V2EX

  • 一面:
  1. 如何開啓多進程?應用是否能夠開啓N個進程?
  2. Activity的啓動模式、任務棧以及使用場景?
  3. Volley可否進行數據量很大的請求,好比說加載100M的圖片?
  4. 手寫快速排序
  5. Volley的優缺點
  6. final修飾一個對象,可否調用對象修改屬性的方法
  7. 子線程中如何使用Handler
  8. 如何進行單元測試,如何保證APP穩定。

面試官是Android的負責人,比較有親和力,看起來比較幽默,,而後先從個人筆試題開始聊,聊地最多的是進程,他問我應用能不能一上來能不能開多個進程保活,對於這個問題我知道確定是不能的,由於本身平時確實沒有在項目中開多個進程,而後面試官態度很好地分析了下說,由於多進程首先會有多個Application,數據會被初始化屢次,其次進程間通訊比較麻煩,還有一個就是每一個進程有單獨的虛擬機,多個進程就會比較佔內存,確實是這樣,這些我有些印象,可是平時確實沒有認真思考過這些問題,而後問我有沒有用過Binder,我說只是寫過幾個Demo,而後面試官就說這個就不問了,就開始聊一些我簡歷上以及我會的東西,好比說Volley的優缺點,而後提出了一個問題說Volley可否下載電影以及加載大圖片,我當時根據我看的源碼說能夠,由於Volley自己是不支持下載的,須要自定義Request才能實現這個功能,而後若是是讀流到磁盤是沒問題的,他說不行由於Volley是在內存中進行操做的,我當時跟他爭了下,我說Volley原生不支持下載功能,只能自定義Request,包括上傳也是須要自定義的,而後他感受我有些不快,說讀流確實是能夠,可是ImageRequest去加載大圖片的時候,也是在內存中讀取的,這個時候就會有問題。不過我想了下確實是這樣,這樣的話確實會出現OOM,接着面試官就問了一個基礎的問題,好比說final通常怎麼用,final修飾對象的話可以調用修改屬性方法等,最後讓我寫了個快排。

  • 二面:
  1. TabLayout如何設置指示器的寬度包裹內容?
  2. 公差爲1的等差數列求和,如何優化
  3. 本身的優點在哪裏
  4. 註解如何獲取,反射爲什麼耗性能?
  5. Java的GC機制,分代回收策略
  6. Binder機制:ServiceManager何時註冊的?
  7. int,long的取值範圍以及BigDecimal,數值越界瞭如何處理?
  8. ConcurrentHashMap的原理,分的段數是多少?
  9. APP是如何適配的?
  10. Android中如何查看一個對象的回收狀況?
  11. 最大一次線上Bug處理措施

面試官問的Java偏多一下,同時也問地很深很細,關於Binder問到了一個問題就是SM是何時註冊的,這個完問題我徹底是懵逼的,而後給我出了一個算法題,就是公差爲1的等差數列求和,當時我用了一個很笨的方法,就是用遞歸實現的,由於當時面試官不是直接說的等差數列,說的是若是輸入0,返回0,若是輸入1,返回1,若是大於1就依次累加,以前思惟定勢了,沒有想到這是個等差數列,而後面試官問我能不能優化,我當時想到了高斯,而後把首尾相加,作了一步優化,後來實在是感受無法優化了,面試官給我寫出了那個等差數列的前n項和,不過當時面試官給我出了這個題目,返回值是int,我當時注意到int可能會越界,而後說應該返回long,估計是這個細節可能打動了面試官,而後咱們就從int,long,到String,double以及BigDecimal,說了不少,由於以前在項目中計算價格的時候確實出現過精度丟失的狀況,因此我對這塊很熟,因此也聊了不少,聊到屏幕適配,ConcurrentHashMap所分的段數,最後問了我最大的一次線上Bug是如何解決的,還有在Android中如何查看一個對象的回收狀況,那個確實不知道,後來想一想應該經過ReferenceQueue能觀察到,由於平時沒有想過這個問題,因此被問到的時候很容易懵逼,不過總體表現還能夠。

  • 三面:
  1. APK的大小如何壓縮
  2. APP的崩潰率,多渠道包
  3. 本身作過的APP用戶量
  4. 可否接受加班

面試官是火幣的大前端負責人,問了我一些項目開發流程上的東西,相似APK的大小如何進行壓縮,如何查看APP的崩潰率,以及多渠道包,而後聊了下薪資以及可否加班等,大部分都是一些非技術性的問題,次日火幣網就給我Offer了,雖而後來我沒有去這家公司,仍是挺感謝這家公司的,給我後續的面試增長了不少信心。

蛋殼公寓

面試機會來自於拉勾網

  • 一面:
  1. MVP如何管理Presenter的生命週期,什麼時候取消網絡請求
  2. 用過的框架及原理
  3. 天貓的Tangram佈局,vLayout原理

面試官是是Android的負責人,主要是在聊本身作過的東西,而後發現咱們不少技術上的觀點都是相同的,好比說咱們都認爲任何一個框架兩三句話均可以把原理說清楚,可是真正本身去實現的時候每每比這個複雜的多,我告訴他我在本身寫圖片加載框架的時候踩過的坑,而後面試官也說了他在使用MVP的過程當中遇到的管理Presenter的生命週期過程當中的探索,由於以前個人一個項目採用的是MVC,當時是用的RxLifecycle進行管理的生命週期,在MVP中我是在BaseActivity中統一把請求取消掉了,而後他說了他的解決方式,確實頗有探索精神,我也學到了不少東西,最後簡單說了天貓的七巧板佈局,大部分仍是在聊項目中的一些細節。

  • 二面:
  1. APP的啓動流程
  2. 回形打印二維數組
  3. Java爲什麼引入泛型,泛型邊界
  4. 常見的Java數據結構
  5. ArrayMap跟SparseArray在HashMap上面的改進
  6. Java的四種引用及使用場景
  7. Webview性能優化

面試官是移動端負責人,而後問了我APP的啓動流程,這個我說我沒怎麼深刻研究過,面試官也沒說啥,而後繼續問了一些Java基礎,Java引入泛型的緣由,泛型邊界,集合框架,最後問到了SparseArray以及ArrayMap。最後說到了內存回收,而後帶出了GC以及四種引用,因爲他們的項目中不少地方用到了WebView,因此他問了一些WebView的跟JS進行交互的問題,最後還聊到了WebView的性能優化,感受面試官確實對WebView比較瞭解,不過我也以爲沒什麼,畢竟這塊不是我擅長的地方,面試官也表示理解,而後最後出了一道算法題就是回形打印二維數組,總體來說他們其實仍是側重於項目,也考察了基礎,總體感受他們的技術仍是很好的。

GrowingIO

面試機會來自於Android Weekly

  • 一面
  1. Binder機制
  2. ClassLoader的理解
  3. Arouter的原理
  4. 組件化原理,組件化中路由的實現
  5. 熱修復跟插件化的原理
  6. 線程池的幾個參數的理解,四種線程池的使用場景
  7. 經常使用的設計模式,手寫DCL單例模式
  8. 進程間爲何不能直接進行通訊
  9. 應用跟系統之間通訊何時用Socket何時用Binder

面試官問地都是Android底層的東西,有些還涉及到了Android的Hook插樁技術,面試完,我以爲本身跟只傻狗同樣,什麼都不會,問了有10來個問題,惟一的兩個應用層的問題因爲緊張也沒有答好,一個是線程池原理,一個是DCL單例少寫了個非空判斷,其他的問題真的是答地很水,由於前面的底層知識了回答地很很差,因此對本身應用層的發揮確實是有影響的,因此但願你們在面試的時候心態必定要平和,切記沒關係張。因爲他們項目在底層採用了不少關於IPC之間的東西,因此基本上須要對底層很瞭解的工程師,我本身也感受確實回答地力不從心,並且我是給他們CTO直接發的簡歷,忽然間以爲很差意思,回答地挺垃圾的。

  • 二面

面試官是作IOS的,基本上是處於聊天的狀態,反正聊地很開心的,而後對我評價很好,他說他不懂Android,可是能感覺到個人技術好奇心,聽了仍是很開心的,反正基本上沒怎麼聊具體的技術,主要是聊了聊IOS的Hook以及熱修復相關的技術,問他們是怎麼實現的,由於我知道IOS在這個上面比Android要複雜一些,反正總體就是很放鬆。

  • 三面

三面是產品總監,基本上就是談古論今了,讓我說說對Android以及IOS的見解,我說谷歌將來確定會在人工智能上幹掉IOS,而後他說爲何,我說由於谷歌掌握了搜索的大數據,Android產品接入的成本低等等,而後我跟他說我但願產品在設計原型的時候須要考慮一下Android跟IOS兩個平臺的差別,不能一刀切,他說是應該這樣,可是有不少時候須要保持平臺一致性就須要作一些妥協之類,最後其實還聊到了錘子,聊了聊對老羅以及錘子的見解,產品總監說錘子的發佈會每場他都會看,而後他還給他家人買了一部堅果Pro,反正想着確定會掛掉,索性就不那麼拘束了,就是一種很放鬆的狀態。

  • 四面

四面是CTO面,當時有點緊張,CTO頗有紳士風度,一上來主動跟我握手,當時我有些緊張,手心都出汗了,他說我是否是很熱,我說是的。而後說本身從網易出來以後就開始創業了,一直是在作提升企業生產效率相關的產品,如今作的GrowingIO也是的,而後問了我不少問題,主要是我在上一份工做中的成長跟收貨,將來的規劃等等,以及在項目中遇到問題是如何進行團隊協做的,問地很細,能夠看地出來公司對這款產品很是重視,像滴滴企業版,陌陌等都是他們的客戶,感受這家公司會發展很不錯,最後我也問他爲何會嘗試作那麼多產品而不是專一於某一款產品等等,而後他也給了詳細的解答。

沒有給我Offer的緣由在於個人薪資可能開地太高,一面基本上是處於被淘汰的局面,可是我跟後面的面試官都聊地很好,晚上還在那兒吃了頓飯,最後CTO還跟我聊了好久,我以爲他們應該是以爲我能夠培養,可是薪資要低偏高,因此就最終放棄了我,由於對於創業公司,個人薪資都開地高一些,無論結果怎麼樣,仍是挺感謝這家公司的,但願他們發展地愈來愈好。

崑崙智啓

面試機會來自於拉勾網

  • 一面:
  1. Debug跟Release的APK的區別
  2. 軟引用跟弱引用的區別
  3. ConcurrentHashmap的原理
  4. Listview跟Recyclerview的區別(刷新,緩存,各自的使用場景)
  5. 對谷歌新推出的Room架構
  6. 動畫的兩種實現:setX跟setTranslationX區別
  7. 事件分發:Activity跟window依次到viewgroup
  8. Volley源碼,優缺點
  9. Picasso傳入的Activity跟Application的context的區別

一面仍是隻要從簡歷上入手,而後問地相對來講比較簡單,面試官應該跟我年限差很少,更多地在於不少東西怎麼去使用,比較側重於一些細節,不過總體來講表現地自我感受比較滿意,由於基本上都是問我會哪些東西,而後從我會的角度出發,一步一步來進行深刻交流。

  • 二面
  1. 數據庫的升級,表結構的修改
  2. 常見的排序算法,手寫二分查找,二分查找的複雜度分析
  3. 點擊APP圖標啓動APP的大體流程
  4. SplashActivity中進行初始化MainActivity的參數,Splash沒有初始化,AMS直接啓動了MainActivity怎麼辦
  5. 設計一個多線程,能夠同時讀,讀的時候不能寫,寫的時候不能讀(讀寫鎖)
  6. 設計斷點續傳,如何判斷服務端是否支持斷點續傳
  7. Binder機制:Binder內核所在的進程是如何找到到Server跟Client進行通訊的
  8. 對JNI是否瞭解
  9. 組件化的原理,組件間通訊

面試官看起來經驗比較豐富,偏向於Java這一塊,應該是從Java轉的Android,看上面的問題其實就可以看出來,問到的Android頗有深度,一上來就搞了個APP的啓動流程以及AMS,那個讀寫鎖確實不會,以前沒聽過,當時是要我實現這個功能,我用了不少種方法去嘗試,可是最終沒有達到預期的效果,而後面試官就問我知不知道讀寫鎖,我不知道,而後他就沒有再深究了,雖然這是一家小公司,可是我能感覺到對一個非科班出身的程序員的尊重,再次表示感謝。

京東

面試機會來自於Boss直聘

京東到家(電面)
  1. GitHub上面的開源項目
  2. 一個線程可否建立多個Handler,Handler跟Looper之間的對應關係
  3. ArrayList跟HashMap是夠線程安全,如何保證線程安全
  4. Volley返回數據量比較大的請求時怎麼辦
  5. ListView跟RecyclerView刷新數據原理,使用到的設計模式
  6. 適配如何作,有沒有適配過全面屏
  7. Fragment跟Activity的通訊方式,你知道幾種?

電話面試以後就掛掉了,第2個問題回答地不是很好,因爲沒試過一個線程能建立幾個Handler,因此不太肯定,最後仍是對Handler機制瞭解地不夠深入,別的基本上答地還能夠,全面屏沒適配過,最後就沒聯繫我了。

京東商城(電面)
  1. 內存泄露的種類
  2. ActivityA啓動ActivityB時生命週期的變化
  3. AMS是如何管理Activity的
  4. JVM中的GC回收機制
  5. 常見的跨進程通訊方式,AIDL的實現原理
  6. APP以及Activity的啓動流程
  7. Hook以及插樁技術

聯繫個人是京東上海的部門,而後說他們主要是作底層的,因此問了一些底層的東西,第2個問題,我就以前沒遇到過,而後Hook插樁這些,很顯然不會,而後就涼涼了。

京東金融
  • 一面:
  1. 從長度爲m的int數組中隨機取出n個元素,每次取的元素都是以前未取過的,如何優化
  2. https是如何保證安全的,證書如何校驗
  3. Android的簽名機制,APK包含哪些東西
  4. 是否遇到過OOM,如何解決
  5. 是否作過逆向
  6. 對JNI瞭解多少
  7. 手寫單例(DCL)
  8. 是否寫過so文件
  9. 熱修復原理,如何進行dex替換的

看面試題其實就能夠發現,京東金融是偏向於安全這個領域的,最後面試官也跟我說,我進去以後會往移動安全工程師方向發展,最開始的那個算法,沒答好,當時個人思路其實是打算取一個數組就把數組中的元素給置空,可是因爲是int數組,因此無法置空,當時就在這兒想了一下子,而後面試官給出的答案是直接刪掉這個元素就能夠了,可是性能較差,若是考慮性能則能夠直接跟尾部元素進行交換,而後下次隨機的範圍減1就能夠了。剩餘的問題答地其實還能夠。

  • 二面:
  1. 簡單說下項目
  2. 內存泄露,如何檢測以及檢測的原理
  3. 點擊Launcher跟點擊微信支付啓動微信有什麼區別
  4. 逆序一個字符串,不能調用String的reverse方法(考察編碼風格)
  5. 組件化原理,模塊化機制
  6. 沒有給權限如何定位,特定機型定位失敗,如何解決
  7. 同步跟異步機制(是業務上的,不知道他想問什麼)
  8. 線程池中核心線程數跟最大線程數如何定義

二面的話問的問題比較常規,基本上跟以前的公司重合度較高,沒有難度,主要比較注重應聘者解決問題的能力,特別是像那個權限適配,我以前作過權限適配,因此那個問題回答地他挺滿意的。

完美世界

面試機會來自於拉勾

  • 一面:
  1. StringBuffer跟StringBuilder之間的區別
  2. 併發相關,各類鎖
  3. View的繪製流程,事件分發
  4. Hashmap,Arraymap,SparseArray
  5. 四種引用
  6. MVP跟MVC的區別
  7. LV跟RV之間的區別
  8. Service相關,startService以及bindService
  9. Fragment不一樣於Activity的生命週期
  10. 生產者消費者問題:一對多,多對多狀況
  11. 常見的設計模式,並選擇一種描述一下
  12. Scroller的使用

看過面試題可以知道,一面比較重基礎,也是一些重複性很高的問題,不過完美的面試官可能比較注重細節,不少問題你只要平時思考過了基本上是OK的。

  • 二面:
  1. Gradle生命週期
  2. Java&Android關於Classloader源碼解析
  3. Python的class文件
  4. DCL中Volatile的做用,如何防止反射實例化單例對象
  5. 抽象類可否實例化,理論依據是什麼?
  6. 如何經過Gradle配置差別較大(20%差別)的多渠道包
  7. class文件如何轉化成dex
  8. Service先start再bind如何關閉service,爲何bindService能夠跟Activity生命週期聯動?
  9. JVM相關,DVM以及ART是如何進行優化的,具體步驟
  10. 長鏈接常見的庫,短連接
  11. 靜態同步鎖與普通同步鎖的區別
  12. 直接在Activity中建立一個thread跟在service中建立一個thread之間恩區別

二面的面試官是北大畢業的,問的問題都比較深刻,涉及到了不少Java跟Android的細節,後來才知道,他知道我基礎還能夠,之因此問到後面的那些問題是由於想給我定級,當我說我瞭解Gradle的時候,面試官問我是否瞭解Gradle的生命週期,當讓我寫一個DCL的時候,問我Volatile的做用是什麼,如何防止單例被反射實例化,DVM&ART是如何對JVM進行優化的,Class文件如何轉換成Dex文件,反正就是你會的確定會讓你表達出來,你不會的你也無法裝下去。

高德—汽車事業部

面試機會來自於Boss

  • 一面:
  1. View的生命週期
  2. View的繪製流程跟事件分發
  3. Activity跟Window之間的關係
  4. 對C跟JNI是否熟悉
  5. 熱修復原理,插件化是如何進行加載插件的
  6. Java中的鎖,各類同步方式之間的區別
  7. ANR在四大組件中的時間,場景
  8. OOM,如何避免
  9. 內存泄露原理,如何避免
  10. MVC跟MVP之間的區別
  11. ListView針對多種item的緩存是如何實現的
  12. Android繪製二維跟三維的View的區別
  13. 是否瞭解硬件加速
  14. ListView是如何實現對不一樣type的item的管理的

面試官問了不少底層的實現場景,有深度也有廣度,在跟他交流的時候,可以很明顯地感受到本身在不少問題上沒有作過太深刻的嘗試,不過總體感受還能夠,基本上本身的能力是徹底發揮出來了,不少問題他問地特別細,好比說ANR問題,問到了在四大組件中ANR的時間是多少,還有ListView的緩存對於多種Type是如何實現的,不少問題你只知道概念是沒有什麼用的,都須要本身的理解,不過像硬件加速這種問題,確實沒有細想過,我也不會去細想,覺得以前在傳統公司是不可能有時間跟精力瞭解這些東西的,只能說北京本身來晚了,可是來對了,當面試官知道我是第一次來北京的時候,還跟我開玩笑說會不會幹幾個月又跑了,最後一面面完以後還讓我留了他的電話,說北京租房子挺貴的,要是有什麼問題的話能夠給他打電話,感動ing。

  • 二面:
  1. Android中IPC方式,各類方式優缺點,爲何選擇用Binder
  2. 主流的熱修復框架流派,原理,是否研究過classloader源碼
  3. Android爲何要設計兩種classloader,爲何不用一種,經過type來區分
  4. Bundle傳遞數據爲何須要序列化
  5. 手寫一個快排,分析原理
  6. 廣播傳輸的數據是否有限制,是多少,爲何要限制?
  7. Activity啓動時生命週期是如何回調的?
  8. MVP.MVC.MVVM之間對比分析
  9. 組件化通信:有幾種通訊方式,Arouter原理
  10. 插件化加載流程,原理
  11. 關於反射混淆,耗性能的解決方式
  12. 天貓七巧板佈局原理
  13. 熱修復流派,原理

面試官的問題基本上是沒有離開過Binder,熱修復以及插件化,不過我確實,因爲緊張,快排寫地也出了點問題,心中千萬頭羊駝呼嘯而過,尷尬地一比,當聊到組件化的時候,我以爲這個是個人優點,而後說了一大堆本身經過反射的實現,而後他說反射會在混淆的時候出問題,還有就是性能上的問題,本身研究了那麼久的東西,在他這裏沒有看到絲毫的價值,確實也比較失落,不過他們是作車機的,確實須要對底層掌握地比較熟練,想着十有八九是涼涼了。

高德—地圖事業部

面試機會來自於Trinea內推

  • 一面:
  1. RecyclerView的itemdecoration如何處理點擊事件
  2. 單例模式如何修改數據
  3. android事件傳遞,很是細
  4. 多線程

一面面試官可能比較忙,沒有問太多的問題,主要聊了聊我GitHub上面的開源項目,當時這個聊了好久,而後說了他們項目中也採用了ItemDecoration的列表聯動,而後就問了我如何處理ItemDecoration的多個點擊,最後聊到了事件分發機制,主要是在ListView裏面嵌套一個Button以及在ListView裏面嵌套一個ScrollerView讓我說一下事件在dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent中的傳遞過程,面試官先讓我說,我只是說了大致流程,而後面試官又給詳細地分析了一遍,分析地很是詳細,確實讓我受益不淺,本身對事件分發的理解又更加進了一步。

  • 二面:
  1. JVM內存分佈,Classloader
  2. 靜態代理跟動態代理
  3. 線程的生命週期
  4. 是否用過DataBinding
  5. 是否接觸過JNI
  6. 對熱修復跟插件化了解多少
  7. 對RN瞭解多少
  8. 二分查找
  9. 說下多態
  10. 編譯期註解跟運行時註解
  11. 線程跟進程間通訊
  12. Android中的IPC
  13. java中的傳遞
  14. equals跟==
  15. Picasso的存儲
  16. 項目中的難點
  17. 項目中用到了哪些第三方
  18. MVC,MVVM,Clean架構
  19. 抽象類跟接口的區別,接口的默認修飾符

二面面試官問了不少基礎方面的東西,問地特別細,主要是考察Java基礎,感受面試官是想跟我探討一下比較新的技術框架 的,可是像DataBinding以及Glide這些我都沒有用過,因此就問了我不少基礎的知識,總體感受還能夠,確實有些基礎沒有掌握好,深度也有些欠缺

掌閱科技

面試機會來自於Boss

  • 一面
  1. Canvas.save()跟Canvas.restore()的調用時機
  2. 程序A可否接收到程序B的廣播?接入微信支付的時候,微信是如何跟當前程序進行通訊?
  3. 對Java.nio瞭解多少
  4. ConcurrentHashMap是如何實現分段鎖?
  5. 如今須要遍歷SD卡下全部的文件打印出後綴名爲.txt文件名稱,如何提升時間效率?
  6. 爲何複寫equals方法的同時須要複寫hashcode方法,前者相同後者是否相同,反過來呢?爲何?
  7. Android4.0~8.0之間大的變化,如何處理?
  8. 說一下Measurespec這個類
  9. ViewHolder有什麼用?
  10. Gradle的Flavor可否配置sourceset?
  11. 線程池核心線程數通常定義多少,爲何?
  12. Intentservice有什麼用
  13. 弱引用何時被回收
  14. Android中提供了哪些類來幫忙處理線程
  15. http的狀態碼,常見的請求頭,http緩存協議https如何加密
  16. 多進程的優缺點,多線程的優缺點
  17. 熱修復如何修復資源文件?
  18. 有沒有遇到64k問題,爲何,如何解決?
  19. httpUrlconnection跟httpClient有什麼區別

掌閱總體的面試質量比較高,可是面試官給個人感受有點過於自信,就像第5道算法題,我當時確實沒有想到除了遍歷以外該如何優化,而後面試官說能夠開多個線程,我當時聽了就以爲很無語,可是他給出的理由是O(n)的算法不能優化,只能開多線程,我說即便不能優化,也是能夠在O(n)的基礎上進行加快的,好比說用遍歷完一遍,作個緩存,作個標記,若是該目錄下沒有發生變化下次能夠直接讀緩存之類的,開多線程這種操做我我的認爲確實算不上優化,最後這個問題不了了之。然後還有一個問題就是他說在複寫equals方法的時候要複寫hashcode方法,可是當時我說不必,若是是本身定義的一個類,只須要比對對象的惟一屬性,好比說定義一個學生對象,我只須要判斷學生的ID是否相等就好了,也就是隻須要複寫equals方法,不必複寫hashcode方法而後場面又很尷尬,我後來想了下可能他想表達的是在集合類中存儲的對象必需要同時複寫equals跟hashcode方法感應該是說地過去的,可是當時沒有這個前提,我以爲在複寫equals方法的時候不必定要複寫hashcode方法,加上前面的那個算法題,可能本身當時情緒也不是很好,因此溝通上確實出現了一些問題。 我記得掌閱是在Boss上面進行投遞的,當時是跟掌閱科技的移動端負責人黃劍進行溝通的,其實最開始知道黃劍是在跟包建強老師一塊兒作一個自定義的ListView的時候,那個時候在性能優化的時候在還在同一個微信羣裏面請教過他問題,因此對掌閱的印象其實挺好的,可是此次面試確實體驗不是很好。

馬蜂窩

面試機會來自於Boss

  • 一面:
  1. 兩個非基本數據類型數組: array1=[x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,×11] array2=[x6,x3,x10,x5] 計算結果:[x6,x7,x8,x9,x1,x2,x3,x4,x10,x11,x5],寫出你的算法
  2. 類的初始化過程
  3. 點擊事件穿透原則
  4. 線程池使用的是哪種,使用原則
  5. LeakedCanary原理
  6. LinerLayout跟RelativeLayout的繪製原理
  7. Android新版本的一些新特性6.0,7.0,8.0
  8. 類的初始化順序依次是(靜態變量、靜態代碼塊)>(變量、代碼塊)>構造方法

一面面試官問地都是基礎,可是有些有難度,好比說那個LinearLayout跟RelativeLayout相對佈局,我當時只回答了LinearLayout須要測量一次,而RelativeLayout須要測量2次,而後若是隻嵌套一層首選LinearLayout,若是多層須要使用RelativeLayout,可是當具體問到RelativeLayout兩次都測量什麼的時候我沒答上來。還有那個算法題。最後實現了,用數組實現的,可是我感受應該是樹,可是對樹不熟悉,因此用的就是數組。

  • 二面:
  1. 看了看項目提了問題如何進行優化
  2. 如何實現馬蜂窩中的一個動畫效果
  3. 軟鍵盤頂起佈局
  4. 組件化通訊方案

二面感受有點沒怎麼發揮好,由於面試官首先問了問我GitHub上的開源項目,可是他找了幾個問題,問我怎麼優化,而後又在我項目裏面發現了幾個問題,問我怎麼優化,很明顯那些問題都是他是比較熟練的,並且都是自定義View相關以及性能優化方面的,最後又拿了馬蜂窩APP裏面的一個滑動動畫問我如何實現,基本上都是在問自定義View,基本上二面就是問了這幾個問題,每一個問題都擴展了不少,可是都是View相關的,沒有涉及到其餘的知識點,可能他們的對於自定義View這塊要求比較高,同時也要兼顧到性能調優,總體來講,自定義View確實不是個人強項,最後還聊到組件化,他們如今也在作組件化,我說了個人方案,貌似他不是很滿意,最後也能感受到發揮地不行,因此被Pass掉了。 還有一個細節就是,一面面完,當時二面面試官不在,是次日過來複試的,次日來了簽到以後又等了將分鐘,而後他們說簽到機壞了,當時感受挺很差的,不過當我二面的時候在那裏等面試官的時候,馬蜂窩的一個員工,年紀挺大了,而後看到個人訪客牌,單獨給我倒了一杯水,確實挺感動的,這個員工不是他們的接待人員,讓我肅然起敬,而後他就繼續上班了,總體發揮很通常,不過那兒的環境確實特別好,頗有風格。

愛奇藝

面試機會來自於拉勾

  • 一面:
  1. 聊聊RecyclerView,動畫,緩存,數據綁定底層是如何實現的。
  2. 聊了聊個人開源項目實現原理
  3. View在屏幕中的移動底層是如何實現的
  4. Binder跟Socket之間的區別,何時用哪個,Binder的底層實現
  5. Activity,Window跟View之間的關係
  6. setContentView都幹了啥
  7. Activity的啓動模式
  8. MVC跟MVP之間的區別
  9. 算法:將一個有序數組去重獲得一個新數組(空間複雜度爲O(N))

愛奇藝確實要求比較高,面試題目難度特別大,讓我說RV的時候,我說了不少,可是面試官感受都不太滿意,而後問地特別細,涉及到了AMS跟WMS,這些問題我回答地通常,除此以外,都答地還能夠,最後面試官說能夠看出我有些東西研究地比較深,可是沒有抓住關鍵點。

  • 二面:
  1. LruCache底層實現
  2. Hashmap的hash算法
  3. Bitmap在decode的時候申請的內存如何複用,釋放時機
  4. 註解如何實現一個findViewById
  5. Android是如何學習的
  6. sycronized關鍵字的類鎖對象鎖,如何保證線程安全?
  7. 重入鎖跟sycronized關鍵字之間的區別
  8. 除了notify還有什麼別的方式能夠喚醒線程
  9. 說說你對Context的理解

二面感受比一面要簡單一些,可是也有幾個問題我沒答上來,當面試官說如何在Bitmap解碼的時候複用申請的內存,我也是第一次知道原來這裏能夠複用,而後我提出了本身的疑問,說若是複用的話,那麼何時回收,他說fresco有本身的回收機制。最後還有Context的理解,我只是看過郭霖的博客,有點影響,確實想不起來了,也是有些尷尬,包括那個用註解實現一個findviewbyid,也是有看過,可是沒有完整的思路,最後支支吾吾地回答了一點,除此以外,別的還好。

  • 三面:
  1. Listview的adapter是什麼adapter,如何複用。
  2. RV是如何佈局的
  3. 算法:如何從1T的無序數組(長度爲n)裏面找出前k大的數據,複雜度要求爲O(logN)
  4. 由A啓動BActivity,A爲棧內複用模式,B爲標準模式,而後再次啓動A或者殺死B,說說A,B的生命週期變化,爲何

三面面試官應該是技術總監,第一個問題就把我難到了,我憑感受說是BaseAdapter,可是轉念一想,不對,ListView還支持ArrayAdapter, 而後面試官笑着說讓我回去看看源碼,接着問了RecyclerView如何繪製的,我當時說了比較多,可是都沒說到點子上去,面試官最後給我耐心地分析了下。給我印象最深的是那個算法題,面試官開始問我有沒有搞過ACM我說沒有,而後他就說看你不是非科班的,就出個簡單點的,而後出了兩道算法題,一題是實現一個鏈表,另一個是寫一個快排,可是我感受面試官對非科班的有些偏見,而後我就說這個太簡單了,我說你就把我當作科班的,而後說我但願可以跟科班的作同樣的題目(後來想一想本身有點飄),而後面試官就出了上面那道算法題, 我一看到O(lgn),感受涼涼了,想着快排最多也是O(nlgn) ,因此當時想了好久,也沒實現,而後面試官給了我提示,說知道快排原理麼,而後我在腦子裏面過了一遍快排,忽然想到了解決思路,而後跟面試官說了個人想法,就是用改良的快排,他微笑着表示承認,而後最後說如何去找到標定元素,我說用隨機數,他說隨機數不太好,而後問了我數學怎麼樣,我說還行,他說能夠採用正太分佈,找到線性分佈的那個中間點,確實是能夠這樣,由於沒有規律的數據是能夠看作正態分佈的,也就是符合線性迴歸的。

美團

面試機會來自於內推

1.APP啓動流程 2.Webview內存泄露 3.組件間通訊,如何傳遞對象 4.Arouter原理 5.如何取消一個網絡請求 6.兩個activity之間來回切換的生命週期變化 7.進程間如何通訊,Binder機制 8.內存泄露及優化 9.自定義view以及事件衝突 10.線程池參數及定義,多線程是否必定會高效 11.電量優化

美團實際上面了三面,可是面試題跟前面的面試官不少重複的,因此就只寫了上面幾道題目,總體面試感受都答上來了,可是問的有些問題確實沒接觸過,好比說Webview的性能優化,電量優化等,最後HR反饋的狀況是基礎很好,項目經驗不足。

獵豹移動

面試機會來自於Boss

  • 筆試
  1. 請例舉Android中經常使用佈局類型,並簡述其用法以及排版效率
  2. 區別Animation和Animator的用法,概述其原理
  3. Thread,Looper,MessageQueue,Handler,Message每一個類的功能以及這些類之間的關係
  4. 如何加載NDK庫?如何在jni中註冊native函數,有幾種註冊方法?
  5. 操做系統中進程和線程有什麼聯繫和區別?系統會在什麼狀況下會在用戶態好內核態中切換。
  6. 若是一個APP裏面有多進程存在,請列舉你所知道的所有IPC方法
  7. 請畫出MVC、MVP模式的差別
  8. 對於Android APP閃退,可能的緣由有哪些?請針對每種狀況簡述分析過程。

筆試題,我答地感受通常,由於我面試的是獵豹移動的Clean Master,因此偏底層一些,不過總體還好,並且筆試題在面試過程當中基本上不怎麼問,只是作一個參考。

  • 一面:
  1. listview跟recyclerview之間的區別,而後上拉加載的時候分別應該如何處理
  2. 項目中用過哪些技術
  3. 同步普通方法跟static方法之間的區別
  4. 不用鎖如何保證int自增安全
  5. 內存爲何會發生泄露
  6. 作過的性能優化,原理
  7. DVK跟JVM之間的區別
  8. 有沒有diss過產品經理
  9. 平時看什麼書
  10. 爲何學python
  11. 項目中用到過哪些技術
  12. 指望在項目中扮演什麼樣的角色

一面面試官主要是從宏觀的角度上看待業務,產品,由於可能看了個人博客跟GitHub,對個人技術有一個大體的瞭解,而後問了一些基礎的東西,就進入了二面。

  • 二面:
  1. Sycronized原理
  2. ReentrantLock原理
  3. 靜態內部類爲何能保證單例,JVM是如何實現的
  4. ART跟DVM作了哪些優化
  5. View是如何繪製到屏幕上的
  6. 寫一個快排,有時間限制
  7. 二面面試官問地特別深,一上來就是各類原理 問了不少原理的原理,好比說Sycronized原理,View如何繪製到屏幕上去,這些對於我來講確實比較難,而後還問到了AQS, CAS的底層實現,答地通常般,我基本上對於JMM的瞭解就是類鎖對象鎖,指令重排序等
  • 三面
  1. GitHub上的開源項目是如何實現的
  2. 將來的職業規劃
  3. 遇到問題如何解決
  4. 爲何沒有本身搭建SS 三面是獵豹移動的產品總監,沒有問技術上的問題,基本上如實回答就好了,沒有那麼多的套路,真誠便可。

摩拜

面試機會來自於拉勾

  • 筆試:

本身帶電腦,他們提供一個接口,實現一個瀑布流,須要考慮動畫,內存管理等,能夠上網搜,限時90分鐘 當時我去的時候出了個之外,HR給個人WiFi我無法連GitHub,當時想着用本身封裝的ImageLoader,沒想着直接用第三方,在使用RecyclerView的時候依賴也無法添加,因此最開始時間都浪費了,直到一面面試官下來,給我鏈接了他們的員工wifi,我才能添加依賴,尷尬的一比,不過到最後時間到了仍是沒有實現預期的效果,面試官最後問我,我說了個人考慮,他說只是想看看我解決問題的能力,徹底能夠用第三方,不必本身實現,不過對個人態度仍是表示承認的,而後開始一面。

  • 一面:
  1. 深拷貝淺拷貝
  2. 輸出一個集合{A,B,C,D}的所有子集
  3. 自定義View及注意事項
  4. 如何自動化部署打包發包流程
  5. JNI是否瞭解過
  6. 內存回收
  7. classloader
  8. 對熱修復以及插件化了解多少
  9. 微信支付寶支付調用時上層是如何封裝AIDL的
  10. 如何給一個app瘦身

基本上在以前的面試都有涉及到,依然是問我會的東西,一點點深刻,第9道面試題我記得在掌閱面試的時候那個面試官說微信用地是廣播,可是摩拜的面試官說微信用地是start ActivityForResult,這個我決定之後本身去深刻研究下,看看他們究竟是如何實現的,別的問題都是比較常見的。

  • 二面:
  1. 如何實現一個推送,極光推送原理

  2. 說說Http協議,以及Tcp/Udp

  3. 常見的設計模式,如何實現一個觀察者模式,若是須要有序通知觀察者,該如何操做

  4. 實現一個圖片加載框架應該考慮哪些

  5. 線程池有哪些參數,應該如何設計

  6. 性能優化是如何作的

  7. Java爲何要推出HashMap,它是如何解決hash衝突的

  8. JVM內存分配,編碼時如何注意內存泄露

  9. Binder機制原理

摩拜問地都是很常見的問題,我能感受到面試官在問我問題的時候並不在意我對這個問題掌握地有多好,而是更加關注我對待某個知識點的態度,更多地賦予面試題一個場景,而不是空談理論,是我比較喜歡的面試官。

  • 三面:
  1. 爲何重複造輪子,本身去設計一些框架的緣由
  2. 如何保證線上項目的穩定性
  3. 本身以前作的項目的規模
  4. 聊了聊他們目前在作的項目

三面面試官跟我聊了聊一些新技術,還有就是我本身爲何要重複造輪子,我說爲了保證項目的穩定性同時可以更好地去定位問題,而後聊了聊他們目前在作的項目,總體感受特別好。

面試以外

上面說地都是一些硬實力,下面簡單說些本身在面試過程當中總結的一些面試以外須要注意的東西

  1. 比較重要的面試安排在下午3點左右,由於北京這邊的互聯網公司基本上都是10點左右上班,那麼頗有可能上午面不完,下午接着面,因此3點的話能夠給你當天的第二家留有更多的緩衝時間
  2. 大公司的面試儘可能安排在前面,由於大公司的流程特別多
  3. 面試前必定要跟HR溝通好,當天儘量一次性面完,若是不能面完就改時間,儘量不要分兩次面,除非狀況特殊。
  4. 家中儘可能放一些零食水果之類的,早上能夠吃一點再去面試,由於若是面試排地滿的話,上午面完以後就得急着趕往下一家,因此我有好幾天都是隻在晚上吃了一頓飯,特別尷尬的時候有時候在面試的時候肚子在咕咕地叫。

後記

除了上面提到的公司以外,我還面試了人人車(Boss直聘),以及58同城(Boss直聘) **並且也都收到了他們的Offer,因爲他們面試的順序排在後面,並且面試題跟以前的面試題有不少共同點,因此就沒有放出來,此外還面試過快看漫畫,面了兩輪,而後CTO須要改天面,我內心其實比較反感這種公司的,由於做爲面試者跑一趟自己就很辛苦,因此後來複試我就沒去,還有一家是青橙科技也是須要我去複試,太遠了,並且當時手裏已經有了Offer就沒去,真心但願這些招人的公司可以在一天內把流程能走完,畢竟像一些大公司在跟我溝通面試的時候都會約定個時間能把全部的面試流程走完。另外還有一家是豆果美食,面試官沒怎麼聊技術,基本上都是在談人生,談理想,最後互相加了微信,而後當時問我有沒有別的Offer,我也知道本身不會去那裏,而後就說愛奇藝給我Offer了,可能他也知道我不會去了,後來就沒有通知複試什麼的,不過感受他比較自信,至少比我自信。

雖然本身此次沒有進入到BAT等一線互聯網公司,頭條,滴滴還有陌陌的簡歷都被刷了,跟那些大佬比起來確實慚愧不少,感受沒啥必要寫這個面試經歷,可是總以爲寫出來了能夠幫到一些人,由於本身以前在技術的道路上也迷茫過,從最初的Android小白,當時看郭霖,張鴻洋還有主席的博客學習,而後在迷茫的時候看主席還有VB的知乎Live,也認識了不少小夥伴,在技術上給了我不少幫助,讓我可以堅持走到今天,同時也感謝每個給我面試機會的面試官,Android之路還會一如既往的走下去,但願這篇文章能夠幫到一些人,就像當初幫到個人那些文章同樣。

相關文章
相關標籤/搜索