2020Android面試心得(二):疫情下的安逸,險在九個面試後斬獲三個offer,這份面試總結值得反思

 

歷時一個半月,斬獲3個大廠offer,在上一篇文章中整理了大廠常考知識點和一些面試技巧,今天就把我面試的幾家公司的面試經歷整理出來,分享一波。

下面是大廠面試真題:

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、泛型擦除,爲何會有擦除?擦除的時機。通配符。
22、synchronized的同步原語
23、鎖的幾種狀態
24、Android熱修復原理,tinker的patch文件如何生成,patch文件是全部加載dex文件首部麼?
25、插件化原理
26、兩個用單鏈表表示的大數相加,求他們的和。單鏈表元素的值爲0~9。
























三面

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






2、新浪

一面

1、封裝的Adapter講解。
2、自定義View:支持換行的尾部標籤的實現。
3、IdleHandler調用時機
4、Bitmap內存計算規則
5、glide默認Bitmap的Config配置是ARGB_8888麼?
6、下面這段代碼有什麼異常?如何解決?




private final ArrayMap<String, Boolean> mBlackFirstFrame = new ArrayMap<>();

public boolean getFlag(String key) {
        return mBlackFirstFrame.get(key);
}

7、下面這段代碼會有什麼問題?如何解決?

public static class Person implements Serializable {
        private One one;
        private Two two;
}

public static class One implements Serializable {

}

public static class Two {

}

8、Java爲何會有線程安全問題?如何解決?

二面

1、vue的binding原理
2、flutter中isolate的原理。
3、promise的原理
4、講一下你的技術棧
5、講下OOM原理
6、講下ANR
7、linux中進程間通信的方式,Android爲何會自己搞一個?
8、Java中進程間共享的數據是放在JVM那個分區的?Java中主進程和子進程間的通信,通過哪塊內存區域?
9、Facebook的litho瞭解過麼?flexbox用過麼?
10、熱修復用的什麼方案?
11、代碼質量如何控制?
12、app質量如何控制?
13、你做過的最爛的一件事是什麼?最好、最自豪的一件呢?











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、組件化
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質量標準,產品標準。









5、百度

一面

1、js調用原生有幾種方式?
2、大圖加載優化,原理。
3、http消息體講一下。消息首行的方法有哪幾種?
4、http post請求上傳大文件,如何實現?分塊上傳呢?用到的關鍵Header有哪些?
5、Activity的onSaveInstance方法何時調用?它跟onPause、onStop的調用順序如何?
6、Activity A啓動Activity B,調用順序。最後Activity A的onStop一定會調用麼?
7、RecyclerView的緩存。
8、kotlin的協程,構造函數。
9、進程間有哪幾種通信方式、binder安全原理、講下aidl內容。
10、binder是cs架構,Server端的binder都是運行在同一個線程裏面麼?
11、講下GC root的類型。
12、講下Handler。
13、講下你做過的首頁優化。
14、講下leakCanary原理,爲什麼不用虛引用?引用隊列裏面存的是什麼?
15、求單鏈表的倒數第n個結點,時間複雜度爲O(1)的解法。bad case是哪種?
16、遍歷目錄及其子目錄,使用非遞歸的方式。














二面

1、講下flutter的項目
2、kotlin的擴展,屬性是否可以擴展,是否可以擴展跟現有方法簽名相同的方法
3、講一下Activity的TaskRecord,也就是四種啓動模式。
4、方法內部的匿名內部類,比如說給View設置的OnClickListener,它裏面相關調用外部方法的形參,必須使用final修飾這個形參,爲何?
5、Android裏面進程間通信方式,ContentProvider可以用file實現麼?
6、linux下常見的進程間通信方式,Android爲何自己搞一個Binder,有何優勢?
7、本地廣播爲何效率高?
8、講下synchronized和volatile;讀寫鎖和ReentrantLock,synchronized和讀寫鎖的區別。
9、佈局優化







 

6、vipkid

一面

1、項目中有哪些亮點?自定義View

①獲取TextView的行數時,StaticLayout原理
②MotionEvent#offsetLocation事件轉發。

2、講下onMeasure方法:

①如何測量
②測量模式
③入參爲什麼是int類型?
④爲什麼會多次調用onMeasure和onLayout方法?


3、講下事件傳遞:

①總體流程
②DOWN事件攔截後,後續事件如何處理?
③dispatchTouchEvent方法返回true後事件如何處理?

4、ActivityA啓動了ActivityB後,兩個Activity的生命週期是怎樣的?

5、線程、進程的區別

6、多線程爲何不安全

7、synchronized和volatile區別

8、Lock的實現,以及與synchronized的區別

9、GCRoot,舉例說明。比如說Activity和它的匿名內部類Handler,分析下引用鏈,對應的gcroot是哪個?

10、圖片內存的計算。

①在不影響圖片質量的前提下,如何減少內存?
②圖片顯示不全、變形怎麼處理?

11、http和https:

①它們的區別:https多了tls層。對稱加密和非對稱加密。
②具體驗證的過程是怎樣的?

12、你擅長的領域:

①Handler
②Activity啓動流程:AMS、zygote、ApplicationThread之間交互;oneway特性(server端不阻塞和client端串行化),非oneway的情況有哪些?
③postDelay(1s)是如何保證1s時間執行的?
④Application啓動流程
⑤ContentProvider啓動流程



13、使用Application#onTrimMemory優化

14、使用ActivityLifecycleCallbacks做了哪些事情?

15、zxing優化

16、如何提高線上代碼質量?

17、你的不足?

18、你的期望

二面

1、直播彈幕如何實現?
2、離職原因,問的很細。
3、以前的app的技術深度,知識沉澱,如何成長等
4、之前的不足,如何避免;最自豪的項目或者片段。
5、職業規劃



7、少年得到

一面

1、講一下項目

2、成員變量和局部變量的區別。爲何成員變量需要jvm在對象初始話過程中賦默認值?

3、講下equals和hashcode,他們爲何必須一起重寫?

4、字符串的 “+” 和 append操作的區別。避免創建多個String對象。

5、泛型和泛型擦除。kotlin真泛型的實現;泛型中T和?的區別,List<?>和List<T>有什麼區別;泛型裏的super和extends區別;泛型爲何會有擦除;擦除的時機;泛型的編譯器類型檢查。

6、HashMap:數據結構(數組加鏈表(或者紅黑樹)),爲何這麼設計;數組和鏈表的特性;元素添加的過程;擴容過程中爲何不整體複製;鏈表爲什麼要轉紅黑樹?

7、HashMap的替代方案,ArrayMap和SparseArray。

8、Parcelable和Serializable本質區別,不要說用法,說原理。

9、Activity和Fragment的生命週期;Fragment#onHiddenChanged是生命週期方法麼?如何觸發?

10、Activity和Fragment的通信方式;系統爲何會設計Fragment#setArgument方法。

11、View繪製流程;requestLayout和invalidate區別;invalidate每次都會觸發onDraw麼?View#onLayout每次會觸發麼?

12、SharedPreference的apply和commit區別;apply會不會導致ANR;SharedPreference的替代方案

13、講下你的自定義View,爲何如此設計?

14、屏幕適配方案;頭條適配方案核心原理。

15、啓動速度優化。

16、繪製優化。

17、JsBridge原理,它是如何解決安全性問題的?

18、mvp和mvvm(面試官說要從訂閱、觀察者角度講)

19、項目架構

20、kotlin的lateinit和by lazy的區別

21、flutter的三棵樹;flutter爲何性能比rn好

二面

1、Android與js交互方式;JsBridge原理,它是如何解決安全性問題的?

2、View繪製優化

3、圖片加載優化,不要講公式,就講你怎麼做的。glide源碼

4、Activity實現了一個Lifecycle接口,有了解麼?

5、如何上傳數據?請求頭關鍵字段和請求體格式

6、音視頻瞭解麼?MediaPlayer能同時播放多個音頻麼?如果需要播放多個提示音,如何實現?

7、Rxjava的map和flatmap區別,flatmap爲何要生成多個Observable?Rxjava的線程種類,線程切換如何實現的?

8、drawable下所以的格式都能轉成webp麼?哪些不能轉?

8、水滴

一面

1、從0到1搭建一個項目框架,你會怎麼做?

2、flutter的生命週期管理?講講做過的flutter項目。flutter的路由管理方式。除了默認的兩種路由方式,有沒有考慮過記錄路由狀態?

3、講下arraylist、hashmap、linkedlist、linkedhashmap的實現。linkedhashmap爲何會有這樣的特性(lru)?它有個參數,表示命中率和使用次數。

4、lru是通過linkedhashmap實現的麼?

5、線程的使用。講下線程池的類型,線程池對象的參數,線程池最大線程數和核心線程數的關係,task的優先級如何實現?(優先級隊列)

6、activity啓動模式:standard、singleTop、singleTask、singleInstance。taskAffinity,allowTaskReparting,常見應用場景。

7、startActivity方法是異步的麼?同步的。

8、activity生命週期。A啓動B,生命週期;B回到A,生命週期

9、rxjava源碼。用過哪些操作符?map和flatmap區別。

10、講下View繪製流程。canvas可以畫Bitmap麼?畫布要做旋轉、縮放、平移等操作該如何實現?

11、講下事件分發。如果onInterceptTouchEvent返回true,但是onTouchEvent返回了false,是什麼效果?如果還想讓其他View接收事件,該怎麼做?

12、flutter中,有沒有遇到過路由斷掉的情況,比如說原生打開flutter,flutter再打開原生這種?

二面

沒聊技術,就聊些職業發展之類的。

9、滴滴-IM部門

一面

1、項目經歷,

2、最有成就感的項目

3、性能優化:UI優化、內存泄漏

4、大圖加載;xhdpi的圖片放到xxhdp的手機上,內存會如何變化;Bitmap內存複用

5、網絡優化,數據庫優化

6、Handler

7、ThreadLocal,LocalBroadcastReceiver實現

8、binder的mmap

9、Java的線程同步方式;synchronized和Lock的實現及區別

10、線程池如何配置,核心線程數你一般給多少

11、Java內存模型

12、TCP和UDP區別,TCP爲何是三次握手,爲何是四次揮手

13、設計模式(問了一個什麼模式,我沒聽清)

14、自定義View,測量模式的匹配

15、事件分發,如何處理滑動衝突

16、啓動速度優化,IdleHandler用法

17、冷啓動熱啓動優化

18、組件化架構設計,ARouter具體實現

19、Activity生命週期,按Home按鍵後的生命週期

20、啓動模式及其用法。A應用的A1頁面啓動B應用的B1頁面,A1和B2都是standard模式,B1啓動後B1在那個任務棧,按下back鍵後顯示那個頁面,再按一次back鍵呢?

21、MVC、MVP、MVVM

22、IM你知道多少?

結束語

面試的最終目的是找到一個自己滿意的offer,也是一個實現自我價值的過程。

歡迎各位同學隨時交流。

最後,祝各位同學都有一個美好的前程。

大廠面試複習路線

多餘的話就不講了,接下來將分享面試的一個複習路線,如果你也在準備面試但是不知道怎麼高效複習,可以參考一下我的複習路線,有任何問題也歡迎一起互相交流,加油吧!

這裏給大家提供一個方向,進行體系化的學習:

1、看視頻進行系統學習

前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰鬥機,也正因爲Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的。我差的是系統知識,差的結構框架和思路,所以通過視頻來學習,效果更好,也更全面。關於視頻學習,個人可以推薦去B站進行學習,B站上有很多學習視頻,唯一的缺點就是免費的容易過時。

另外,我自己也珍藏了好幾套視頻,有需要的我也可以分享給你。

2、進行系統梳理知識,提升儲備

客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。

系統學習方向:

  • 架構師築基必備技能:深入Java泛型+註解深入淺出+併發編程+數據傳輸與序列化+Java虛擬機原理+反射與類加載+動態代理+高效IO

  • Android高級UI與FrameWork源碼:高級UI晉升+Framework內核解析+Android組件內核+數據持久化

  • 360°全方面性能調優:設計思想與代碼質量優化+程序性能優化+開發效率優化

  • 解讀開源框架設計思想:熱修復設計+插件化框架解讀+組件化框架設計+圖片加載框架+網絡訪問框架設計+RXJava響應式編程框架設計+IOC架構設計+Android架構組件Jetpack

  • NDK模塊開發:NDK基礎知識體系+底層圖片處理+音視頻開發

  • 微信小程序:小程序介紹+UI開發+API操作+微信對接

  • Hybrid 開發與Flutter:Html5項目實戰+Flutter進階

知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。

3、讀源碼,看實戰筆記,學習大神思路

“編程語言是程序員的表達的方式,而架構是程序員對世界的認知”。所以,程序員要想快速認知並學習架構,讀源碼是必不可少的。閱讀源碼,是解決問題 + 理解事物,更重要的:看到源碼背後的想法;程序員說:讀萬行源碼,行萬種實踐。

主要內含微信 MMKV 源碼、AsyncTask 源碼、Volley 源碼、Retrofit源碼、OkHttp 源碼等等。

 

4、面試前夕,刷題衝刺

面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。

關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:

 

5、簡歷+社招解答+經典HR面試解析

以上是整理總結的Android中高級面試遇到的真題解析,希望對大家有幫助;同時很多人經常也會遇到很多關於簡歷製作,職業困惑、HR經典面試問題回答等有關面試的問題。同樣我也蒐集整理了全套簡歷製作、金三銀四社招困惑、HR面試等問題解析,有疑問,可以提供專業的解答。

 

對於Android開發的朋友來說應該是最全面最完整的面試資料,爲了更好地整理每個模塊,我參考了很多網上的優質博文和項目,力求不漏掉每一個知識點。很多朋友靠着這些內容進行復習,拿到了BATJ等大廠的offer,這個資料也已經幫助了很多的安卓開發者,希望也能幫助到你。

最後想要獲取以上完整的《2020 Android BAT面試寶典》,點這裏可以看到全部內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章