參考來源:字節(jié)跳動技術(shù)團隊圈盔、郭霖、鴻洋罚拟、玉剛台诗、掘金博主 xiangzhihong、Focusing赐俗、simpleeeeee拉队、DevYK、簡書博主 huangLearn阻逮、騰訊享學(xué)課堂粱快、慕課網(wǎng)、極客時間叔扼、尚學(xué)堂…
Android內(nèi)含:Activity事哭、Fragment、service瓜富、布局優(yōu)化鳍咱、AsyncTask相關(guān)、Android 事件分發(fā)機制与柑、 Binder流炕、Android 高級必備 :AMS,WMS,PMS澎现、Glide、 Android 組件化與插件化等面試題和技術(shù)棧每辟!
Java內(nèi)含:HashMap剑辫、ArrayList、LinkedList 渠欺、Hashset 源碼分析妹蔽、內(nèi)存模型、垃圾回收算法(JVM)挠将、多線程胳岂、注解、反射舔稀、泛型乳丰、設(shè)計模式等面試題和技術(shù)棧!
由于文章內(nèi)容比較多内贮,篇幅有限产园,資料已經(jīng)被整理成目錄,歡迎大家學(xué)習(xí)交流夜郁。
1.Activity
說下Activity生命周期
Activity A 啟動另一個Activity B 會調(diào)用哪些方法什燕?如果B是透明主題的又或則是個DialogActivity呢
說下onSaveInstanceState()方法的作用 ? 何時會被調(diào)用?
Activity的啟動流程
onSaveInstanceState(),onRestoreInstanceState的掉用時機
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的方式,注意事項
Activity任務(wù)棧是什么
有哪些Activity常用的標(biāo)記位Flags
Activity的數(shù)據(jù)是怎么保存的,進程被Kill后,保存的數(shù)據(jù)怎么恢復(fù)的
2.Service
service 的生命周期统台,兩種啟動方式的區(qū)別
Service的兩種啟動方式雕擂?區(qū)別在哪
如何保證Service不被殺死 ?
Service與Activity怎么實現(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的實現(xiàn)原理
ContentProvider的優(yōu)點
Uri 是什么
5.Handler
Handler的實現(xiàn)原理
子線程中能不能直接new一個Handler,為什么主線程可以主線程的Looper第一次調(diào)用loop方法,什么時候,哪個類
Handler導(dǎo)致的內(nèi)存泄露原因及其解決方案
一個線程可以有幾個Handler,幾個Looper,幾個MessageQueue對象
Message對象創(chuàng)建的方式有哪些 & 區(qū)別募寨?
Message.obtain()怎么維護消息池的
Handler 有哪些發(fā)送消息的方法
Handler的post與sendMessage的區(qū)別和應(yīng)用場景
handler postDealy后消息隊列有什么變化,假設(shè)先 postDelay 10s, 再postDelay 1s, 怎么處理這2條消息
MessageQueue是什么數(shù)據(jù)結(jié)構(gòu)
Handler怎么做到的一個線程對應(yīng)一個Looper森缠,如何保證只有一個MessageQueue ThreadLocal在Handler機制中的作用
HandlerThread是什么 & 好處 &原理 & 使用場景
IdleHandler及其使用場景
消息屏障,同步屏障機制
子線程能不能更新UI
為什么Android系統(tǒng)不建議子線程訪問UI
Android中為什么主線程不會因為Looper.loop()里的死循環(huán)卡死
MessageQueue#next 在沒有消息的時候會阻塞拔鹰,如何恢復(fù)?
Handler消息機制中贵涵,一個looper是如何區(qū)分多個Handler的
當(dāng)Activity有多個Handler的時候列肢,怎么樣區(qū)分當(dāng)前消息由哪個Handler處理
處理message的時候怎么知道是去哪個callback處理的
Looper.quit/quitSafely的區(qū)別
通過Handler如何實現(xiàn)線程的切換
Handler 如何與 Looper 關(guān)聯(lián)的
Looper 如何與 Thread 關(guān)聯(lián)的
Looper.loop()源碼
MessageQueue的enqueueMessage()方法如何進行線程同步的
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繪制和屏幕刷新機制原理
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 的流程和注意事項
自定義View如何考慮機型適配
自定義控件優(yōu)化方案
invalidate怎么局部刷新
View加載流程(setContentView)
7.View事件分發(fā)
View事件分發(fā)機制
view的onTouchEvent怀骤,OnClickListerner和OnTouchListener的onTouch方法 三者優(yōu)先級
onTouch 和onTouchEvent 的區(qū)別
ACTION_CANCEL什么時候觸發(fā)
事件是先到DecorView還是先到Window
點擊事件被攔截费封,但是想傳到下面的View,如何操作
如何解決View的事件沖突
在 ViewGroup 中的 onTouchEvent 中消費 ACTION_DOWN 事件蒋伦,ACTION_UP事件是怎么傳遞
Activity ViewGroup和View都不消費ACTION_DOWN,那么ACTION_UP事件是怎么傳遞的
同時對父 View 和子 View 設(shè)置點擊方法弓摘,優(yōu)先響應(yīng)哪個
requestDisallowInterceptTouchEvent的調(diào)用時機
8.RecycleView
RecyclerView的多級緩存機制,每一級緩存具體作用是什么,分別在什么場景下會用到哪些緩存
RecyclerView的滑動回收復(fù)用機制
RecyclerView的刷新回收復(fù)用機制
RecyclerView 為什么要預(yù)布局
ListView 與 RecyclerView區(qū)別
RecyclerView性能優(yōu)化
9.Viewpager&Fragment
Fragment的生命周期 & 結(jié)合Activity的生命周期
Activity和Fragment的通信方式, Fragment之間如何進行通信
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.動畫
動畫的類型
補間動畫和屬性動畫的區(qū)別
ObjectAnimator爷抓,ValueAnimator及其區(qū)別
TimeInterpolator插值器势决,自定義插值器
TypeEvaluator估值器
12.Bitmap
Bitmap 內(nèi)存占用的計算
getByteCount() & getAllocationByteCount()的區(qū)別
Bitmap的壓縮方式
LruCache & DiskLruCache原理
如何設(shè)計一個圖片加載庫
有一張非常大的圖片,如何去加載這張大圖片
如果把drawable-xxhdpi下的圖片移動到drawable-xhdpi下,圖片內(nèi)存是如何變的蓝撇。
如果在hdpi果复、xxhdpi下放置了圖片,加載的優(yōu)先級渤昌。如果是400_800虽抄,1080_1920,加載的優(yōu)先級独柑。
13.mvc&mvp&mvvm
MVC及其優(yōu)缺點
MVP及其優(yōu)缺點
MVVM及其優(yōu)缺點
MVP如何管理Presenter的生命周期迈窟,何時取消網(wǎng)絡(luò)請求
14.Binder
Android中進程和線程的關(guān)系,區(qū)別
為何需要進行IPC,多進程通信可能會出現(xiàn)什么問題
Android中IPC方式有幾種、各種方式優(yōu)缺點
為何新增Binder來作為主要的IPC方式
什么是Binder
Binder的原理
Binder Driver 如何在內(nèi)核空間中做到一次拷貝的忌栅?
使用Binder進行數(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索绪,手動編碼來實現(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)存的具體實現(xiàn)是什么
relayout是如何向SurfaceFlinger申請Surface
什么是Surface
19.AMS
ActivityManagerService是什么鸭津?什么時候初始化的?有什么作用肠缨?
ActivityThread是什么?ApplicationThread是什么?他們的區(qū)別
Instrumentation是什么逆趋?和ActivityThread是什么關(guān)系?
ActivityManagerService和zygote進程通信是如何實現(xiàn)的
ActivityRecord怜瞒、TaskRecord父泳、ActivityStack,ActivityStackSupervisor吴汪,ProcessRecord
ActivityManager惠窄、ActivityManagerService、ActivityManagerNative漾橙、ActivityManagerProxy的關(guān)系
手寫實現(xiàn)簡化版AMS
20.系統(tǒng)啟動
android系統(tǒng)啟動流程
SystemServer杆融,ServiceManager,SystemServiceManager的關(guān)系
孵化應(yīng)用進程這種事為什么不交給SystemServer來做霜运,而專門設(shè)計一個Zygote
Zygote的IPC通信機制為什么使用socket而不采用binder
21.App啟動&打包&安裝
應(yīng)用啟動流程
apk組成和Android的打包流程
Android的簽名機制脾歇,簽名如何實現(xiàn)的,v2相比于v1簽名機制的改變
APK的安裝流程
22.序列化
什么是序列化
為什么需要使用序列化和反序列化
序列化的有哪些好處
Serializable 和 Parcelable 的區(qū)別
什么是serialVersionUID
為什么還要顯示指定serialVersionUID的值?
23.模塊化&組件化
什么是模塊化
什么是組件化
組件化優(yōu)點和方案
組件獨立調(diào)試
組件間通信
Aplication動態(tài)加載
ARouter原理
24.熱修復(fù)&插件化
插件化的定義
插件化的優(yōu)勢
插件化框架對比
插件化流程
插件化類加載原理
插件化資源加載原理
插件化Activity加載原理
熱修復(fù)和插件化區(qū)別
熱修復(fù)原理
25.AOP
AOP是什么
AOP的優(yōu)點
AOP的實現(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緩存機制,內(nèi)存緩存,磁盤緩存
Glide與Picasso的區(qū)別
LruCache原理
Retrofit源碼流程,動態(tài)代理
LeakCanary弱引用,源碼流程
Eventbus
Rxjava
二. Java面試相關(guān)
1.HashMap
HashMap原理
HashMap 有用過嗎淘捡?您能給我說說他的主要用途嗎藕各?
您能說說 HashMap 常用操作的底層實現(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()如何實現(xiàn)的
HashMap中g(shù)et()如何實現(xiàn)的
為什么HashMap線程不安全
HashMap1.7和1.8有哪些區(qū)別
解決hash沖突的時候,為什么用紅黑樹
紅黑樹的效率高灿渴,為什么一開始不用紅黑樹存儲
不用紅黑樹洛波,用二叉查找樹可以不
為什么閥值是8才轉(zhuǎn)為紅黑樹
為什么退化為鏈表的閾值是6
hash沖突有哪些解決辦法
HashMap在什么條件下擴容
HashMap中hash函數(shù)怎么實現(xiàn)的,還有哪些hash函數(shù)的實現(xiàn)方式
為什么不直接將hashcode作為哈希值去做取模,而是要先高16位異或低16位
為什么擴容是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)生背景
物理機的并發(fā)問題
Java 內(nèi)存模型的組成分析
Java 內(nèi)存間的交互操作
Java 內(nèi)存模型運行規(guī)則
6. 垃圾回收算法(JVM)
Jvm的內(nèi)存模型,每個里面都保存的什么
類加載機制的幾個階段加載蹬挤、驗證、準(zhǔn)備荸百、解析闻伶、初始化滨攻、使用够话、卸載
對象實例化時的順序
類加載器,雙親委派及其優(yōu)勢
垃圾回收機制
談?wù)剬?JVM 的理解?
JVM 內(nèi)存區(qū)域蓝翰,開線程影響哪塊區(qū)域內(nèi)存?
對 Dalvik女嘲、ART 虛擬機有什么了解畜份?對比
7.多線程
談一談java線程模型
Java中創(chuàng)建線程的方式,Callable,Runnable,Future,FutureTask
線程的幾種狀態(tài)
談?wù)劸€程死鎖,如何有效的避免線程死鎖欣尼?
如何實現(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.注解
注解的分類和底層實現(xiàn)原理
自定義注解
9.反射
什么是反射
反射機制的相關(guān)類
反射中如何獲取Class類的實例
如何獲取一個類的屬性對象 & 構(gòu)造器對象 & 方法對象
Class.getField和getDeclaredField的區(qū)別驻子,getDeclaredMethod和getMethod的區(qū)別
反射機制的優(yōu)缺點
10.泛型
泛型概念的提出(為什么需要泛型)?
什么是泛型估灿?
自定義泛型接口崇呵、泛型類和泛型方法
類型通配符
11.設(shè)計模式
你所知道的設(shè)計模式有哪些
單例設(shè)計模式
工廠設(shè)計模式
建造者模式(Builder)
適配器設(shè)計模式
裝飾模式(Decorator)
策略模式(strategy)
觀察者模式(Observer)
由于文章內(nèi)容比較多,篇幅有限馅袁,資料已經(jīng)被整理成目錄域慷,歡迎大家學(xué)習(xí)交流。