1. 程式人生 > 實用技巧 >Android茫茫半年求職路,終於斬獲三個大廠offer

Android茫茫半年求職路,終於斬獲三個大廠offer

前言

2019年底,公司出現危機,開始“優化”,本組一個小兄弟被“優化”,於是我也著手開始做準備,將來若輪到我被“優化”,出去面試時也好打個有準備的仗。

這裡我可以交代一下,我從四月份開始準備面試,複習知識點,金九銀十開始去面試到拿到3個大廠offer(京東、位元組跳動、滴滴),大概是半年時間,時間跨度比較的長,大概參與了二三十家公司的面試,因為基本上是騎驢找馬,並不急,我只想拿到大廠的offer。

準備

主要是明確自己想要加入的公司,並開始做技術準備,狂刷面試題。目標公司是BAT,我需要到更大的平臺和更優秀的人做更好的專案,正常來說加入BAT以後可以讓自己的實力和眼界得到提升,並且有一線大廠的光環對以後都是蠻重要的。

有人說去哪裡都一樣,去了大廠也是個螺絲釘,我想說我寧願做航空母艦上的螺絲釘也不願意做拖拉機上的螺絲釘。其實在求職的過程中一次又一次的失敗曾經讓我放棄BAT了,轉而投向其他我認為有前景的公司,不過我還是非常想去BAT!做夢都想去。

常考知識點

1、Java

  • 講下equals和hashcode,他們為何必須一起重寫?hashcode方法重寫規則。

  • HashMap相關。

①HashMap新增元素的過程,hash方法細節;擴容的觸發條件、擴容過程中是資料是整體複製麼?連結串列轉紅黑樹的閾值為何是8,紅黑樹轉連結串列的閾值為何是6,為何不上同一個閾值?連結串列為何要轉紅黑樹?紅黑樹有何特性?hashmap為何如此設計?
②對應的併發容器。HashTable以及ConcurrentHashMap實現細節,優劣勢; 如何使現有的HashMap執行緒安全?(Collections#synchronizedMap)

  • 執行時資料區域分割槽,哪些執行緒私有,哪些執行緒共享。棧幀的資料結構。方法區存放哪些資料。

  • 簡單描述一下 Person person = new Person() 物件例項化過程。最好有類載入過程。

  • GCRoot的型別,舉例說明。

  • LRU的實現。讓你自己實現一個,你會怎麼做。

  • 執行緒的幾種狀態。

  • 執行緒池。

  • 執行緒池中的任務可以實現按照優先順序執行麼,如何實現?(優先順序佇列)

  • 執行緒池的設計用到了那種設計思想?(生產者消費者模型)

  • 何為阻塞佇列?

  • 你是如何配置執行緒池的?核心執行緒數你一般是怎麼配置的?

  • T1、T2、T3三個執行緒,如何保證它們順序執行?也就是非同步轉同步的方式。

  • Java中 wait和sleep方法的不同?(wait釋放鎖,sleep不會釋放鎖)

  • 執行緒安全相關。

  • 鎖。synchronized、volatile、Lock。鎖的幾種狀態。CAS原理。

  • 為什麼會有執行緒安全?

  • Java中如何保證執行緒安全?

  • synchronized和Lock的使用、區別及底層實現;volatile的作用和使用方式;常見的原子類。

  • synchronized中的類鎖和物件鎖互斥麼?

  • 講下Java的雙親委派。

  • 泛型。

  • 反射。

  • 註解。

由於篇幅有限,僅展示部分內容,所有的知識點 整理的詳細內容都放在了我的【GitHub】,有需要的朋友自取。

2、Android

  • 啟動模式,以及常見用法。

①舉例說明
②taskAffinity,allowTaskReparting的用法。
③有沒有遇到哪些詭異的現象?如何解決的?

  • Activity生命週期。

①常見生命週期方法
②A啟動B的,然後按back鍵,執行了哪些方法?如果是A啟動B的,然後按home鍵呢?
③onSaveInstance方法呼叫時機。

  • Bitmap記憶體優化。

①Bitmap記憶體如何計算?如何在不改變圖片質量的情況下優化?Bitmap記憶體複用(Options.inBitmap)
②超大圖載入(BitmapRegionDecoder)
③跨程序傳遞大圖(Bundle#putBinder)

  • xhdpi的圖片分別顯示到hdpi和xxhdpi的手機上,顯示的大小和記憶體是怎樣的?

  • 資原始檔載入規則。比如說圖片存放在drawable-hdpi和drawable-xxhdpi下,xhdpi的手機會載入哪張?如果刪除掉drawable-xxhdpi下的圖片呢?

  • Android的程序間通訊方式。

①Android為何要自己搞一個binder,使用linux原有的通訊方式不行麼?(安全、效能好,方便易用)
②binder通訊的記憶體大小限制。(1M和128k)
③binder的架構(Application、ServiceManager、系統Service、binder驅動),以獲取系統服務的過程舉例分析。
④Application#onCreate裡面可以使用binder服務麼(可以)?Application的binder機制是何時啟動的(zygote在fork好應用程序後,會給應用啟動binder機制)?binder機制啟動的幾個關鍵步驟。
⑤binder執行緒池預設最大數量(15)?
⑥binder和AIDL。
⑦oneway。

  • 談談你對Android中Context的理解?四大元件裡面的Context都來源於哪裡。

  • Application啟動流程。

①AMS是如何確認Application啟動完成的?關鍵條件是什麼(zygote返給AMS的pid;應用的ActivityThread#main方法中會向AMS上報Application的binder物件)?
②Application#constructor、Application#onCreate、Application#attach他們的執行順序(132)。Activity和Service呢?

  • startActivity的具體過程。

  • Activity#setContentView的具體過程。

①PhoneWindow是何時建立的,它的作用是什麼?
②setContentView中傳遞的資原始檔是如何變成View物件的?
③佈局檔案對應的View物件是新增到哪裡的?
④Activity的佈局是何時顯示出來的?
⑤ViewRootImpl是何時初始化的?它的作用是什麼?
⑥Choreography瞭解麼?作用是什麼?

  • Surface的作用是什麼?它是何時初始化的?View繪製的資料是如何顯示到螢幕上的?

  • Handler機制:

①應用層,訊息的傳送、接收、獲取和處理;訊息是如何儲存的?延時訊息一定準時麼?是如何保證延時時間的?Handler#dispatchMessage細節,如何使用?
②Handler的Framework層。Looper#loop方法為何不會導致ANR?nativePollOnce細節。eventfd和epoll機制瞭解麼?
③IdleHandler瞭解麼?合適呼叫?如何使用?靠譜麼?
④handler裡面訊息有幾種?普通訊息、同步訊息、訊息屏障。如何使用?如何區分普通訊息和非同步訊息?
⑤如何實現給Handler傳送一個Runnable,又不通過Handler#post(Runnable run)這個API?(Message#obj屬性,或者通過反射設定Message#callback屬性)
⑥Message#obtain實現細節瞭解麼?為何要池化?最大限制容量是多少?

  • ThreadLocalMap的實現。

  • View繪製流程

①onMeasure、onLayout、onDraw
②MeasureSpec為何如此設計?
③子View的LayoutParams來源。ViewGroup#addView(view)這種新增view的方式,沒有給子View設定LayoutParams,那麼LayoutParams是誰設定的?
④onMeasure和onLayout為何會執行兩次或多次?
⑤View#draw方法細節。
⑥View繪製這一塊遇到過什麼問題麼?如何解決的。

  • 自定義View有哪幾種方式?注意事項。你對自定義屬性如何理解?

  • 事件分發。滑動衝突如何解決,具體在哪個方法裡面解決?如何判斷滑動方向?

  • Apk打包流程。R檔案最終會生成什麼檔案?aapt的作用是什麼?

  • LocalBroadcastReceiver,為何比BroadCastReceiver速度快,LocalBroadcastReceiver的實現。

  • RecyclerView的快取。RecyclerView的優勢是哪些?都用它做過什麼功能?

  • 講下leakCanary原理。為什麼不用虛引用?引用佇列裡面存的是什麼?記憶體資料是如何dump出來的?

  • 講下OkHttp的實現。攔截器的順序,網路攔截器和普通攔截器有什麼區別?它的執行緒池是怎樣的?如何管理的?

  • glide的三級快取如何做的?

  • rxjava的原理。rxjava的執行緒切換如何實現的?map和flatmap操作符區別;zip和merge操作符區別。

  • ArrayMap和SparseArray的作用和實現細節。

  • 元件化和模組化的區別。

  • mvp、mvvm。

  • jetpack元件。

  • gradle中task的生命週期。

  • 外掛化原理。

  • 熱修復原理。

由於篇幅有限,僅展示部分內容,所有的知識點 整理的詳細內容都放在了我的【GitHub】,有需要的朋友自取。

3、Android效能優化

  • 啟動速度優化。冷啟動、溫啟動、熱啟動了解麼。

  • 記憶體優化

  • 卡頓優化

  • 網路優化

  • 資料庫優化

  • 記憶體洩漏優化

  • 包體積優化

有需要的朋友【點選我】免費獲取。

4、http相關

  • 描述一個完整的網路請求流程。

  • TCP和UDP區別,三次握手與四次揮手的細節;為何建立連結需要三次,斷開連結卻需要四次。

  • http和https區別。https的連結過程?

  • 斷線續傳如何實現。大圖分段上傳如何實現。關鍵步驟

  • 分段下載如何實現。

  • 請求重試機制如何實現。

5、設計模式

  • 你熟悉哪些設計模式?請舉例說明。為何選用這個設計模式。

  • 策略模式和橋接模式的區別

6、kotlin

  • 說一下kotlin的優缺點。let和with的區別

  • 擴充套件函式

  • kotlin的lateinit和by lazy的區別

  • 建構函式有哪幾種

  • 協程

7、flutter

  • flutter的isolate

  • flutter的優勢和劣勢

  • flutter的channel通訊方式有哪幾種?

  • flutter的包體積優化

  • flutter中State的生命週期,didUpdateWidget方法何時呼叫

8、專案相關

  • 選一個你最熟悉的專案講解下。

  • 講一下你的技術棧

  • 你最自豪的專案或者片段

  • 你最擅長哪些部分

  • 你的上份工作經歷中,最大的收穫是什麼?

  • 你的職業規劃

面試進行時

1、滴滴

一面

1、View繪製流程。onMeasure、onLayout、onDraw。
2、豎向的TextView如何實現。TextView文字描邊效果如何實現。
3、事件分發。衝突解決。
4、動畫
5、RecyclerView的特點和快取
6、SparseArray和ArrayMap。具體實現原理和特性
7、說一下kotlin的優缺點。let和with的區別
8、介面和抽象類的區別,介面中可以有屬性麼?
9、用過哪些設計模式?策略模式和橋接模式的區別
10、多執行緒如何實現?有哪些方式?
11、執行緒池的引數
12、你如何自己實現一個LRUCache?Android裡面的LRUCache是如何實現的?
13、synchronized和volatile的區別?為何不用volatile替代synchronized?類鎖和物件鎖互斥麼?
14、gcroot的型別
15、jvm的執行時資料結構。棧幀中會有什麼異常?方法區裡面存放的是什麼資料?
16、動態代理的實現。
17、Gradle的實現,gradle中task的生命週期。
18、Aop、AspectJ、ASM瞭解麼
19、元件化和模組化的區別。ARouter的缺點。
20、MVP、MVVM的優缺點,jetpack中的元件
21、okhttp原始碼。
22、glide快取
23、你對flutter的理解

二面

1、react的單向資料流
2、redux的狀態管理,如何實現的?關鍵角色有哪些?
3、flutter的channel通訊有哪幾種?你用的哪種?外掛你如何實現的?
4、flutter的包體積優化
5、自定義View的關鍵步驟,注意事項,你的理解
6、MeasureSpec講一下
7、包體積優化
8、混淆的步驟和原理
9、module間的資原始檔merge後,生成過多的R檔案,處理過麼?如何處理?
10、Bitmap記憶體大小,注意事項,如何優化
11、啟動速度優化
12、glide中對Bitmap做了哪些操作?三級快取?為何在有了記憶體快取後,還要持有ActivityRef這個呢?
13、gradle宣告週期,task,外掛
14、註解:Source和Class、Runtime註解的區別
15、卡頓優化
16、記憶體洩漏檢測及優化
17、RecyclerView的快取,區域性重新整理用過麼?
18、List的滑動卡頓如何優化
19、Activity中的Window的初始化和顯示過程
20、Application中可以顯示Dialog麼?為什麼?
21、泛型擦除,為何會有擦除?擦除的時機。萬用字元。
下面這段程式碼有問題麼?有什麼問題?為何會有這個問題?

List<? extends Object> list = new ArrayList<>();
list.add(123);
Object obj = list.get(0);

22、synchronized的同步原語
23、鎖的幾種狀態
24、Android熱修復原理,tinker的patch檔案如何生成,patch檔案是全部載入dex檔案首部麼?
25、外掛化原理
26、兩個用單鏈表表示的大數相加,求他們的和。單鏈表元素的值為0~9。

三面

1、選一個你的專案講一下
2、技術選型是如何做的
3、優化記憶體
4、上傳的重試機制
5、OOM和記憶體洩漏
6、包體積優化
7、你最擅長的點
8、你的職業規劃

2、度娘

  • 晚上八點半,在雨中打著傘接到電話,進行電話面試,一面就掛了。

  • Bitmap 使用時候注意什麼?

  • Oom 是否可以try catch ?

  • 記憶體洩露如何產生?

  • 介面卡模式,裝飾者模式,外觀模式的異同?

  • ANR 如何產生?

  • String buffer 與string builder 的區別?

  • 如何保證執行緒安全?

  • java四中引用

  • Jni 用過麼?

  • 多程序場景遇見過麼?

  • 關於handler,在任何地方new handler 都是什麼執行緒下

  • sqlite升級,增加欄位的語句

  • bitmap recycler 相關

強引用置為null,會不會被回收?

glide 使用什麼快取?

  • Glide 記憶體快取如何控制大小?

  • 如何保證多執行緒讀寫檔案的安全?

面試官聲音略顯慵懶疲憊……我懷疑他是不是面了太多人已經麻木了

3、京東物流

一面

1、模組化,元件化,開發中要點有哪些。元件間如何去除強依賴。
2、Android11有沒有適配
3、flutter中State的生命週期,didUpdateWidget方法何時呼叫
4、包體積如何優化

二面

1、上家公司期間你的技術亮點,期間遇到什麼問題,如何解決的,原理深挖。
2、View的繪製流程。MeasureSpec,關鍵方法,
3、LRU如何實現的?LinkedHashMap如何實現的?LinkedHashMap是否執行緒安全?如何實現執行緒安全?有序還是無序?
4、ThreadLocal幹嘛的?用法和原理。
5、HashMap講一下,資料結構、hash過程、擴容、載入因子為何是0.75等。
6、Handler講一下。Message#what的不同值,會影響Message在MessageQueue中的順序麼?
7、講下Java的雙親委派
8、外掛化和熱更新原理
9、講一下鎖,synchronized和Lock。CAS原理
10、事件分發

三面

1、對vue的掌握程度
2、現有專案情況
3、包體積優化細節
4、畫現有專案的架構圖
5、後端互動過程中有遇到什麼難以解決的問題麼?如何解決的。
6、講下你覺得最好或者最自豪的專案

四面

1、講下hashmap;連結串列轉紅黑樹的限制為何是8;紅黑樹的時間複雜度;紅黑樹轉連結串列的限制為何是6;current hashmap在所有情況下都是執行緒安全的嗎?hashtable呢?
2、synchronized實現。非靜態方法A和B在同一個類中,方法A用synchronized修飾,當A方法因為多執行緒請求有執行緒阻塞在物件鎖上的時候,B方法的訪問受不受影響?
3、既然泛型有編譯期型別擦除,那麼執行時無法獲取到具體型別;而反射能在執行時獲取到Class的型別;它們一個獲取不到,一個可以獲取到,這不就是矛盾麼?請解釋下細節。
4、在同一個手機上,如果把drawable-xxhdpi下的圖片移動到drawable-xhdpi下,圖片記憶體是如何變的,解釋原理。如果在drawable-hdpi、drawable-xxhdpi下放置了圖片,但是手機是xhdpi的,會優先載入哪個,載入優先順序是怎樣的?如果是400800,10801920這種呢,會如何查詢?xhdpi和400*800同時存在時,會如何查詢?佈局檔案呢?
5、圖片記憶體優化;
6、Handler機制。MessageQueue中的Message是如何排列的?Msg的runnable物件可以外部設定麼,比如說不用Handler#post系列方法(反射可以實現);
7、application中持有靜態的使用者資訊,有何缺點?如何改進?
8、mvp和mvvm,jetpack

4、位元組跳動

一面

1.外掛化。啟動activity的hook方式。taskAffity。
2.okhttp支援HTTP2?http2的功能有哪些?tcp方面擁塞控制?tsl的握手和具體的非對稱加密演算法。非對稱名稱
3.handler的post(Runnable)如何實現的。callback,runnable,msg的執行優先順序。
4.阻塞是怎麼實現的?為什麼不會阻塞主執行緒?
5.求二叉樹中兩個節點之間的最大距離。
6.206含義,未修改資源是哪個,302含義,301含義
7.多程序通訊問題。binder優勢。aidl生成的java類細節。多程序遇到哪些問題?
8.動態代理傳入的引數都有哪些?非介面的類能實現動態代理嗎?ASM的原理
9.Application和Activity在Context的繼承樹上有何區別?二者使用上有何不同?
10.任意一顆二叉樹,求最大節點距離

二面

1.設計一個日誌系統。
2.記憶體洩露的分類。怎麼檢視記憶體洩露的問題
3.touch事件原始碼問題。
4.元件化的問題。module和app之間的區別。moduler通訊是如何實現的。
5.native奔潰的日誌採集,怎麼處理?
6.註解實現一個提示功能:如果int的值大於了3需要提示。

三面

1.介紹下flutter的啟動流程
2.介紹下flutter與weex的區別
3.元件化介紹一下
4.webview中與js通訊的手段有哪些?
5.介紹下flutter_boost的原理

四面

1.介面卡和裝飾模式各自特點和使用場景
2.視訊編解碼是怎麼做的
3.三色球排序

5、小米

一面

1、元件化
2、mvp優缺點,mvvm
3、kotlin
4、單例的幾種實現方式:DCL、enum,靜態內部類。還有餓漢式。懶漢式的使用場景:佔用記憶體大、延遲初始化
5、jvm:執行時資料分割槽;類載入過程;GCRoot,垃圾回收演算法。
6、hashmap。hash衝突時給連結串列插入資料,1.7頭插法,1.8尾插法。
7、ArrayMap和SparseArray的區別,實現。
8、泛型:為何會有協變和逆變,PECS規則。
9、kotlin泛型:out和in.
10、Handler。Looper.loop( )為何不會阻塞程序。
11、自定義View的幾種方式。onMeasure、onLayout、onDraw方法都何時需要重寫。自定義屬性的作用。
12、事件分發,多點觸碰處理,是在onTouchEvent方法裡面。
13、網路優化,網路監控。
14、網路分層架構,https的連線過程,tcp和udp的區別。
15、blog相關。
16、滑動視窗的最大值。

二面

1、滑動衝突如何解決?有幾種方式?具體從哪個事件開始攔截?在哪裡攔截?比如雙層ViewPager巢狀的滑動衝突如何解決。

2、事件分發的具體流程。

3、Activity#setContentView中的xml檔案是如何轉化成View並顯示到Activity中的。
①PhoneWindow是在哪裡初始化的?
②LayoutInflater是如何把xml佈局檔案轉換成View物件的(反射)?View樹如何生成的?怎麼優化?
③為什麼會有R檔案這個對映表?直接使用資源的路徑不好麼?
④Android專案中都包含哪些資源?apk打包流程。apk解壓後都包含哪些資源?R檔案打包後生成的檔案是哪種?
⑤dex檔案結構瞭解過麼?為何會有65535的限制?mutildex技術瞭解麼?這項技術的目的是什麼?
⑥Window和Activity的對應關係。除了Activity還有別的方式顯示Window出來麼?

4、繪製相關:
①requestLayout呼叫後,都會呼叫哪些方法?
②onMeasure、onLayout、onDraw這三個方法中,哪個最耗時?onMeasure和onLayout呢?
③Choreography的作用。它的上游和下游各自是哪個。Choreography釋出了訂閱訊息,同類型的Callback還有哪些?這些Callback之間的優先順序如何?vsync機制。
④Surface物件瞭解麼?作用,何時初始化,怎麼使用的。
⑤一個Button的點選事件中,呼叫requestLayout,接下來哪些方法會被呼叫?
⑥Surface和Window的關係
⑦SurfaceView的實現
⑧View#draw()方法細節
⑨繪製的資料是如何提交到遠端的SurfaceFlinger
⑩GPU和surfaceFlinger之間的設計思想是什麼?surfaceFlinger具體作用是什麼?它對資料做了哪些操作?
⑪硬體加速瞭解麼?GPU如何高效繪製?

5、ContentProvider具體實現。

6、binderService方法中的回撥具體執行在哪個執行緒?binder執行緒池最大執行緒數是多少?自定義的Callback遠端呼叫,執行在哪個執行緒?為何不是主執行緒,如果執行在主執行緒會有哪些問題?

7、hdpi和xxhdpi的手機,分別載入xhdpi下的圖片,會縮放圖片麼?如果會縮放,是如何縮放的,畫素點是如何補全或者減少的?圖片在記憶體中的大小會如何變化?

8、作業系統:
①講一下使用者態和核心態
②為何會有使用者態和核心態劃分

9、資料結構:
①二叉樹用的多麼?哪裡用過?
②二叉搜尋樹、AVL樹,紅黑樹
③二叉樹的使用舉例。
④連結串列和二叉樹的區別,優劣勢

10、jetpack元件庫使用過麼?講下具體元件

11、函數語言程式設計如何理解?

12、t1、t2、t3三個執行緒,如何讓三個執行緒按照順序依次列印1-100。手寫。

三面

1、懸浮窗如何實現
2、通知的類別
3、為何需要程序保活?如何做?
4、程序優先順序
5、Android為何會使用binder來進行程序間通訊。
6、oneway和非oneway瞭解麼?舉例說明
7、binder執行緒池的最大執行緒個數;binder執行緒池中如果滿了,對待新來的任務,會如何處理?此時client端會是什麼效果?
8、ANR的log中關鍵字是什麼?
9、你認為優秀的工作流程是怎樣的?
10、講下你專案的技術棧。
11、你認為好的app質量標準,產品標準。

在複習的三四個月時間裡,把大廠的面試題做了一個整理,有需要的朋友可以去我的【GitHub】自取,免費分享給大家,算是一個感恩回饋吧。

最後

大廠面試問深度,小廠面試問廣度,如果有同學想進大廠深造一定要有一個方向精通的驚豔到面試官,還要平時遇到問題後思考一下問題的本質,找方法解決是一個方面,看到問題本質是另一個方面。還有大家一定要有目標,我在很久之前就想著以後一定要去大廠,然後默默努力,每天看一些大佬們的文章,總是覺得只有再學深入一點才有機會,所以才有恆心一直學下去。