對于很多沒有學(xué)歷優(yōu)勢的人來說,面試大廠就像是鯉魚跳龍門,跳過了化身神獸一飛沖天,跳不過摔進(jìn)泥土粉身碎骨。對我而言,也是一樣。出身于專科,原本以為就三點(diǎn)一線的生活度過一生,曾也不切實(shí)際幻想過進(jìn)大廠但在一面就被虐的體無完膚,分分鐘打回原形。原本決定沉穩(wěn)平淡的過一生,但生活上的變故,讓我有了新的想法和目標(biāo),因此我這個專科渣渣也奮斗了起來。
今年面試了百度、騰訊、網(wǎng)易、字節(jié)跳動、阿里等大廠,竟拿下了阿里P6的offer。今天就分享一下我在面試大廠前使用的《2022最新Android面試真題合集》,主要是希望能夠幫助到同樣被學(xué)歷所困擾的技術(shù)人,能夠更好的掌握面試的知識點(diǎn),并對自己的對職業(yè)生涯和技術(shù)規(guī)劃有一個參考價值。
Android中高級技術(shù)面面試題
一. Java面試相關(guān)
1.HashMap
- HashMap原理
- HashMap 有用過嗎?您能給我說說他的主要用途嗎?
- 您能說說 HashMap 常用操作的底層實(shí)現(xiàn)原理嗎?如存儲 put(K key, V value),查找 get(Object key),刪除 remove(Object key),修改 replace(K key, V value)等操作
- hash 沖突(或者叫 hash 碰撞)是什么?為什么會出現(xiàn)這種現(xiàn)象,如何解 決 hash 沖突?
- HashMap 的容量為什么一定要是 2 的 n 次方?
- 您能說說 HashMap 和 HashTable 的區(qū)別嗎?
- HashMap中put()如何實(shí)現(xiàn)的
- HashMap中g(shù)et()如何實(shí)現(xiàn)的
- 為什么HashMap線程不安全
- HashMap1.7和1.8有哪些區(qū)別
- 解決hash沖突的時候,為什么用紅黑樹
- 紅黑樹的效率高,為什么一開始不用紅黑樹存儲
- 不用紅黑樹,用二叉查找樹可以不
- 為什么閥值是8才轉(zhuǎn)為紅黑樹
- 為什么退化為鏈表的閾值是6
- hash沖突有哪些解決辦法
- HashMap在什么條件下擴(kuò)容
- HashMap中hash函數(shù)怎么實(shí)現(xiàn)的,還有哪些hash函數(shù)的實(shí)現(xiàn)方式
- 為什么不直接將hashcode作為哈希值去做取模,而是要先高16位異或低16位
- 為什么擴(kuò)容是2的次冪
- 鏈表的查找的時間復(fù)雜度是多少
- 紅黑樹
2.ArrayList
- ArrayList定義
- ArrayList 的構(gòu)造器
- add 方法源碼分析
- get 方法源碼分析
- set 方法源碼分析
- ArrayList和LinkedList的區(qū)別,以及應(yīng)用場景
3. LinkedList
- LinkedList 定義
- LinkedList 支持的操作
- Node 類
- addFirst 源碼分析
- getFirst 方法源碼分析
- removeFirst 方法源碼分析
- add(int index, E e)方法源碼分析
4. Hashset 源碼
- 屬性
- 構(gòu)造方法
- 添加元素
- 刪除元素
- 查詢元素
- 遍歷元素
- 全部源碼
5. 內(nèi)存模型
- 內(nèi)存模型產(chǎn)生背景
- 物理機(jī)的并發(fā)問題
- Java 內(nèi)存模型的組成分析
- Java 內(nèi)存間的交互操作
- Java 內(nèi)存模型運(yùn)行規(guī)則
6. 垃圾回收算法(JVM)
- Jvm的內(nèi)存模型,每個里面都保存的什么
- 類加載機(jī)制的幾個階段加載、驗(yàn)證、準(zhǔn)備、解析、初始化、使用、卸載
- 對象實(shí)例化時的順序
- 類加載器,雙親委派及其優(yōu)勢
- 垃圾回收機(jī)制
- 談?wù)剬?JVM 的理解?
- JVM 內(nèi)存區(qū)域,開線程影響哪塊區(qū)域內(nèi)存?
- 對 Dalvik、ART 虛擬機(jī)有什么了解?對比
7.多線程
- 談一談java線程模型
- Java中創(chuàng)建線程的方式,Callable,Runnable,Future,FutureTask
- 線程的幾種狀態(tài)
- 談?wù)劸€程死鎖,如何有效的避免線程死鎖?
- 如何實(shí)現(xiàn)多線程中的同步
- synchronized和Lock的使用、區(qū)別,原理;
- volatile,synchronized和volatile的區(qū)別?為何不用volatile替代synchronized?
- 鎖的分類,鎖的幾種狀態(tài),CAS原理
- 為什么會有線程安全?如何保證線程安全
- sleep()與wait()區(qū)別,run和start的區(qū)別,notify和notifyall區(qū)別,鎖池,等待池
- Java多線程通信
- 為什么Java用線程池
- Java中的線程池參數(shù),共有幾種
- 說下 Java 中的線程創(chuàng)建方式,線程池的工作原理
8.注解
- 注解的分類和底層實(shí)現(xiàn)原理
- 自定義注解
9.反射
- 什么是反射
- 反射機(jī)制的相關(guān)類
- 反射中如何獲取Class類的實(shí)例
- 如何獲取一個類的屬性對象 & 構(gòu)造器對象 & 方法對象
- Class.getField和getDeclaredField的區(qū)別,getDeclaredMethod和getMethod的區(qū)別
- 反射機(jī)制的優(yōu)缺點(diǎn)
10.泛型
- 泛型概念的提出(為什么需要泛型)?
- 什么是泛型?
- 自定義泛型接口、泛型類和泛型方法
- 類型通配符
11.設(shè)計(jì)模式
- 你所知道的設(shè)計(jì)模式有哪些
- 單例設(shè)計(jì)模式
- 工廠設(shè)計(jì)模式
- 建造者模式(Builder)
- 適配器設(shè)計(jì)模式
- 裝飾模式(Decorator)
- 策略模式(strategy)
- 觀察者模式(Observer)
二. Android面試相關(guān)
1.Activity
- 說下Activity生命周期
- Activity A 啟動另一個Activity B 會調(diào)用哪些方法?如果B是透明主題的又或則是個DialogActivity呢
- 說下onSaveInstanceState()方法的作用 ? 何時會被調(diào)用?
- Activity的啟動流程
- onSaveInstanceState(),onRestoreInstanceState的掉用時機(jī)
- activity的啟動模式和使用場景
- Activity A跳轉(zhuǎn)Activity B,再按返回鍵,生命周期執(zhí)行的順序
- 橫豎屏切換,按home鍵,按返回鍵,鎖屏與解鎖屏幕,跳轉(zhuǎn)透明Activity界面,啟動一個 Theme 為 Dialog 的 Activity,彈出Dialog時Activity的生命周期
- onStart 和 onResume、onPause 和 onStop 的區(qū)別
- Activity之間傳遞數(shù)據(jù)的方式Intent是否有大小限制,如果傳遞的數(shù)據(jù)量偏大,有哪些方案
- Activity的onNewIntent()方法什么時候會執(zhí)行
- 顯示啟動和隱式啟動
- scheme使用場景,協(xié)議格式,如何使用
- ANR 的四種場景
- onCreate和onRestoreInstance方法中恢復(fù)數(shù)據(jù)時的區(qū)別
- activty間傳遞數(shù)據(jù)的方式
- 跨App啟動Activity的方式,注意事項(xiàng)
- Activity任務(wù)棧是什么
- 有哪些Activity常用的標(biāo)記位Flags
- Activity的數(shù)據(jù)是怎么保存的,進(jìn)程被Kill后,保存的數(shù)據(jù)怎么恢復(fù)的
2.Service
- service 的生命周期,兩種啟動方式的區(qū)別
- Service的兩種啟動方式?區(qū)別在哪
- 如何保證Service不被殺死 ?
- Service與Activity怎么實(shí)現(xiàn)通信
- IntentService是什么,IntentService原理,應(yīng)用場景及其與Service的區(qū)別
- Service 的 onStartCommand 方法有幾種返回值?各代表什么意思?
- bindService和startService混合使用的生命周期以及怎么關(guān)閉
- 用過哪些系統(tǒng)Service ?
- 了解ActivityManagerService嗎?發(fā)揮什么作用
3.BroadcastReceiver
- 廣播的分類和使用場景
- 廣播的兩種注冊方式的區(qū)別
- 廣播發(fā)送和接收的原理
- 本地廣播和全局廣播的區(qū)別
4.ContentProvider
- 什么是ContentProvider及其使用
- ContentProvider的權(quán)限管理
- ContentProvider,ContentResolver,ContentObserver之間的關(guān)系
- ContentProvider的實(shí)現(xiàn)原理
- ContentProvider的優(yōu)點(diǎn)
- Uri 是什么
5.Handler
- Handler的實(shí)現(xiàn)原理
- 子線程中能不能直接new一個Handler,為什么主線程可以主線程的Looper第一次調(diào)用loop方法,什么時候,哪個類
- Handler導(dǎo)致的內(nèi)存泄露原因及其解決方案
- 一個線程可以有幾個Handler,幾個Looper,幾個MessageQueue對象
- Message對象創(chuàng)建的方式有哪些 & 區(qū)別?
- Message.obtain()怎么維護(hù)消息池的Handler 有哪些發(fā)送消息的方法
- Handler的post與sendMessage的區(qū)別和應(yīng)用場景
- handler postDealy后消息隊(duì)列有什么變化,假設(shè)先 postDelay 10s, 再postDelay 1s, 怎么處理這2條消息
- MessageQueue是什么數(shù)據(jù)結(jié)構(gòu)
- Handler怎么做到的一個線程對應(yīng)一個Looper,如何保證只有一個MessageQueue ThreadLocal在Handler機(jī)制中的作用
- HandlerThread是什么 & 好處 &原理 & 使用場景
- IdleHandler及其使用場景
- 消息屏障,同步屏障機(jī)制
- 子線程能不能更新UI
- 為什么Android系統(tǒng)不建議子線程訪問UI
- Android中為什么主線程不會因?yàn)長ooper.loop()里的死循環(huán)卡死
- MessageQueue#next 在沒有消息的時候會阻塞,如何恢復(fù)?
- Handler消息機(jī)制中,一個looper是如何區(qū)分多個Handler的
- 當(dāng)Activity有多個Handler的時候,怎么樣區(qū)分當(dāng)前消息由哪個Handler處理
- 處理message的時候怎么知道是去哪個callback處理的
- Looper.quit/quitSafely的區(qū)別
- 通過Handler如何實(shí)現(xiàn)線程的切換
- Handler 如何與 Looper 關(guān)聯(lián)的
- Looper 如何與 Thread 關(guān)聯(lián)的
- Looper.loop()源碼
- MessageQueue的enqueueMessage()方法如何進(jìn)行線程同步的
- MessageQueue的next()方法內(nèi)部原理
- 子線程中是否可以用MainLooper去創(chuàng)建Handler,Looper和Handler是否一定處于一個線程
- ANR和Handler的聯(lián)系
6.View繪制
- View繪制流程
- MeasureSpec是什么
- 子View創(chuàng)建MeasureSpec創(chuàng)建規(guī)則是什么
- 自定義Viewwrap_content不起作用的原因
- 在Activity中獲取某個View的寬高有幾種方法
- 為什么onCreate獲取不到View的寬高
- View#post與Handler#post的區(qū)別
- Android繪制和屏幕刷新機(jī)制原理
- Choreography原理
- 什么是雙緩沖
- 為什么使用SurfaceView
- 什么是SurfaceView
- View和SurfaceView的區(qū)別
- SurfaceView為什么可以直接子線程繪制
- SurfaceView、TextureView、SurfaceTexture、GLSurfaceView
- getWidth()方法和getMeasureWidth()區(qū)別
- invalidate() 和 postInvalidate() 的區(qū)別
- Requestlayout,onlayout,onDraw,DrawChild區(qū)別與聯(lián)系
- LinearLayout、FrameLayout 和 RelativeLayout 哪個效率高
- LinearLayout的繪制流程
- 自定義 View 的流程和注意事項(xiàng)
- 自定義View如何考慮機(jī)型適配
- 自定義控件優(yōu)化方案
- invalidate怎么局部刷新
- View加載流程(setContentView)
7.View事件分發(fā)
- View事件分發(fā)機(jī)制
- view的onTouchEvent,OnClickListerner和OnTouchListener的onTouch方法 三者優(yōu)先級
- onTouch 和onTouchEvent 的區(qū)別
- ACTION_CANCEL什么時候觸發(fā)
- 事件是先到DecorView還是先到Window
- 點(diǎn)擊事件被攔截,但是想傳到下面的View,如何操作
- 如何解決View的事件沖突
- 在 ViewGroup 中的 onTouchEvent 中消費(fèi) ACTION_DOWN 事件,ACTION_UP事件是怎么傳遞
- Activity ViewGroup和View都不消費(fèi)ACTION_DOWN,那么ACTION_UP事件是怎么傳遞的
- 同時對父 View 和子 View 設(shè)置點(diǎn)擊方法,優(yōu)先響應(yīng)哪個
- requestDisallowInterceptTouchEvent的調(diào)用時機(jī)
8.RecycleView
- RecyclerView的多級緩存機(jī)制,每一級緩存具體作用是什么,分別在什么場景下會用到哪些緩存
- RecyclerView的滑動回收復(fù)用機(jī)制
- RecyclerView的刷新回收復(fù)用機(jī)制
- RecyclerView 為什么要預(yù)布局
- ListView 與 RecyclerView區(qū)別
- RecyclerView性能優(yōu)化
9.Viewpager&Fragment
- Fragment的生命周期 & 結(jié)合Activity的生命周期
- Activity和Fragment的通信方式, Fragment之間如何進(jìn)行通信
- getFragmentManager、getSupportFragmentManager 、getChildFragmentManager之間的區(qū)別?
- 為什么使用Fragment.setArguments(Bundle)傳遞參數(shù)
- FragmentPagerAdapter與FragmentStatePagerAdapter的區(qū)別與使用場景
- FragmentPageAdapter和FragmentStatePageAdapter區(qū)別及使用場景
- Fragment懶加載
- ViewPager2與ViewPager區(qū)別
- Fragment嵌套問題
10.WebView
- 如何提高WebView加載速度
- WebView與 js的交互
- WebView的漏洞
- JsBridge原理
11.動畫
- 動畫的類型
- 補(bǔ)間動畫和屬性動畫的區(qū)別
- ObjectAnimator,ValueAnimator及其區(qū)別
- TimeInterpolator插值器,自定義插值器
- TypeEvaluator估值器
12.Bitmap
- Bitmap 內(nèi)存占用的計(jì)算
- getByteCount() & getAllocationByteCount()的區(qū)別
- Bitmap的壓縮方式
- LruCache & DiskLruCache原理
- 如何設(shè)計(jì)一個圖片加載庫
- 有一張非常大的圖片,如何去加載這張大圖片
- 如果把drawable-xxhdpi下的圖片移動到drawable-xhdpi下,圖片內(nèi)存是如何變的。
- 如果在hdpi、xxhdpi下放置了圖片,加載的優(yōu)先級。如果是400_800,1080_1920,加載的優(yōu)先級。
13.mvc&mvp&mvvm
- MVC及其優(yōu)缺點(diǎn)
- MVP及其優(yōu)缺點(diǎn)
- MVVM及其優(yōu)缺點(diǎn)
- MVP如何管理Presenter的生命周期,何時取消網(wǎng)絡(luò)請求
14.Binder
- Android中進(jìn)程和線程的關(guān)系,區(qū)別
- 為何需要進(jìn)行IPC,多進(jìn)程通信可能會出現(xiàn)什么問題
- Android中IPC方式有幾種、各種方式優(yōu)缺點(diǎn)
- 為何新增Binder來作為主要的IPC方式
- 什么是Binder
- Binder的原理
- Binder Driver 如何在內(nèi)核空間中做到一次拷貝的?
- 使用Binder進(jìn)行數(shù)據(jù)傳輸?shù)木唧w過程
- Binder框架中ServiceManager的作用
- 什么是AIDL
- AIDL使用的步驟
- AIDL支持哪些數(shù)據(jù)類型
- AIDL的關(guān)鍵類,方法和工作流程
- 如何優(yōu)化多模塊都使用AIDL的情況
- 使用 Binder 傳輸數(shù)據(jù)的最大限制是多少,被占滿后會導(dǎo)致什么問題
- Binder 驅(qū)動加載過程中有哪些重要的步驟
- 系統(tǒng)服務(wù)與bindService啟動的服務(wù)的區(qū)別
- Activity的bindService流程
- 不通過AIDL,手動編碼來實(shí)現(xiàn)Binder的通信
15.內(nèi)存泄漏&內(nèi)存溢出
- 什么是OOM & 什么是內(nèi)存泄漏以及原因
- Thread是如何造成內(nèi)存泄露的,如何解決?
- Handler導(dǎo)致的內(nèi)存泄露的原因以及如何解決
- 如何加載Bitmap防止內(nèi)存溢出
- MVP中如何處理Presenter層以防止內(nèi)存泄漏的
16.性能優(yōu)化
- 內(nèi)存優(yōu)化
- 啟動優(yōu)化
- 布局加載和繪制優(yōu)化
- 卡頓優(yōu)化
- 網(wǎng)絡(luò)優(yōu)化
17.Window&WindowManager
- 什么是Window
- 什么是WindowManager
- 什么是ViewRootImpl
- 什么是DecorView
- Activity,View,Window三者之間的關(guān)系
- DecorView什么時候被WindowManager添加到Window中
18.WMS
- 什么是WMS
- WMS是如何管理Window的
- IWindowSession是什么,WindowSession的創(chuàng)建過程是怎樣的
- WindowToken是什么
- WindowState是什么
- Android窗口大概分為幾種?分組原理是什么
- Dialog的Context只能是Activity的Context,不能是Application的Context
- App應(yīng)用程序如何與SurfaceFlinger通信的
- View 的繪制是如何把數(shù)據(jù)傳遞給 SurfaceFlinger 的
- 共享內(nèi)存的具體實(shí)現(xiàn)是什么
- relayout是如何向SurfaceFlinger申請Surface
- 什么是Surface
19.AMS
- ActivityManagerService是什么?什么時候初始化的?有什么作用?
- ActivityThread是什么?ApplicationThread是什么?他們的區(qū)別
- Instrumentation是什么?和ActivityThread是什么關(guān)系?
- ActivityManagerService和zygote進(jìn)程通信是如何實(shí)現(xiàn)的
- ActivityRecord、TaskRecord、ActivityStack,ActivityStackSupervisor,ProcessRecord
- ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的關(guān)系
- 手寫實(shí)現(xiàn)簡化版AMS
20.系統(tǒng)啟動
- android系統(tǒng)啟動流程
- SystemServer,ServiceManager,SystemServiceManager的關(guān)系
- 孵化應(yīng)用進(jìn)程這種事為什么不交給SystemServer來做,而專門設(shè)計(jì)一個Zygote
- Zygote的IPC通信機(jī)制為什么使用socket而不采用binder
21.App啟動&打包&安裝
- 應(yīng)用啟動流程
- apk組成和Android的打包流程
- Android的簽名機(jī)制,簽名如何實(shí)現(xiàn)的,v2相比于v1簽名機(jī)制的改變
- APK的安裝流程
22.序列化
- 什么是序列化
- 為什么需要使用序列化和反序列化
- 序列化的有哪些好處
- Serializable 和 Parcelable 的區(qū)別
- 什么是serialVersionUID
- 為什么還要顯示指定serialVersionUID的值?
23.模塊化&組件化
- 什么是模塊化
- 什么是組件化
- 組件化優(yōu)點(diǎn)和方案
- 組件獨(dú)立調(diào)試
- 組件間通信
- Aplication動態(tài)加載
- ARouter原理
24.熱修復(fù)&插件化
- 插件化的定義
- 插件化的優(yōu)勢
- 插件化框架對比
- 插件化流程
- 插件化類加載原理
- 插件化資源加載原理
- 插件化Activity加載原理
- 熱修復(fù)和插件化區(qū)別
- 熱修復(fù)原理
25.AOP
- AOP是什么
- AOP的優(yōu)點(diǎn)
- AOP的實(shí)現(xiàn)方式,APT,AspectJ,ASM,epic,hook
26.Jectpack
- Navigation
- DataBinding
- Viewmodel
- livedata
- liferecycle
27.開源框架
- Okhttp源碼流程,線程池
- Okhttp攔截器,addInterceptor 和 addNetworkdInterceptor區(qū)別
- Okhttp責(zé)任鏈模式
- Okhttp緩存怎么處理
- Okhttp連接池和socket復(fù)用
- Glide怎么綁定生命周期
- Glide緩存機(jī)制,內(nèi)存緩存,磁盤緩存
- Glide與Picasso的區(qū)別
- LruCache原理
- Retrofit源碼流程,動態(tài)代理
- LeakCanary弱引用,源碼流程
- Eventbus
- Rxjava
更多面試可以查看我的個人介紹!!!