歷時一個半月,斬獲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面試寶典》,點這裏可以看到全部內容。