前言
又快要到了一年一度的金九銀十黃金跳槽時節(jié),也是互聯(lián)網(wǎng)大廠瘋狂招人的時期,現(xiàn)在應該有很多Android程序員已經按耐不住了。但是現(xiàn)在網(wǎng)上的面試題資料太多了,而且有些面試題已經過時甚至是漏洞百出。今天結合自己前段時間的面試經歷和幾位大廠大佬交流討論總結出這份2023年Android中高級最全面試題來幫助大家輕松搞定offer。話不多說,直接上干貨!??!
面試題
一、Activity的啟動方式
standard 不管有沒有已存在的實例,都生成新實例
singleTop 如果發(fā)現(xiàn)有對應的Activity實例位于棧頂,則重復利用,否則創(chuàng)建實例
singleTask a)棧內復用,復用時具有clearTop機制 b)single taskAffinity in task
singleInstance a)啟用一個新的棧結構,將Activity放置于棧結構中,并保證不會有其
它Activity實例進入 b)方便多個應用共享全局唯一的實例
二、Handler防止內存泄露
原因 a).聲明Handler為靜態(tài)類,同時對于Activity的this引用封裝成WeakReference
否則會導致匿名類引用了外部Activity,導致Activity不能被回收 b).如果這時對手機硬
件進行橫豎屏切換,講導致Activity被創(chuàng)建,卻不能被回收
措施
a).public void onDestroy()
{
mHandler.removeCallbacksAndMessages(null);
}
static class MyHandler extends Handler {
WeakReference<Activity > mActivityReference;
MyHandler(Activity activity) {
mActivityReference= new WeakReference<Activity>(activity);
}
@Override
public void handleMessage(Message msg) {
final Activity activity = mActivityReference.get();
if (activity != null) {
mImageView.setImageBitmap(mBitmap);
}
}
}
三、SoftReference跟WeakRefrence的區(qū)別
WeakRefrence => 與強引用對象的生命周期一致,不會增加引用計數(shù)
SoftReference => 內存不足時才進行回收
四、如何避免OOM
減少內存對象的占用
- ArrayMap/SparseArray代替hashmap
- 避免在android里面使用Enum
- 減少bitmap的內存占用
- 減少資源圖片的大小,過大的圖片可以考慮分段加載
五、Devik 進程,linux 進程,線程的區(qū)別
Dalvik進程。
每一個android app都會獨立占用一個dvm虛擬機,運行在linux系統(tǒng)中。
所以dalvik進程和linux進程是可以理解為一個概念。
六、Framework 工作方式及原理,Activity 是如何生成一個 view 的,機制是什么
Framework是android 系統(tǒng)對 linux kernel,lib庫等封裝,提供WMS,AMS,bind機制,handler-message機制等方式,供app使用。
簡單來說framework就是提供app生存的環(huán)境。
- Activity在attch方法的時候,會創(chuàng)建一個phonewindow(window的子類)
- onCreate中的setContentView方法,會創(chuàng)建DecorView
- DecorView 的addview方法,會把layout中的布局加載進來。
由于篇幅原因,以上面試題只抽取部分內容展示,需要更多章節(jié)面試題內容的可以繼續(xù)往下看哦
Java方面
Java基礎部分
- 抽象類與接口的區(qū)別?
- 分別講講 final,static,synchronized
- 請簡述一下String、StringBuffer和
- “equals”與“==”、“hashCode”的區(qū)別和使用場景?
- Java 中深拷貝與淺拷貝的區(qū)別?
- 談談Error和Exception的區(qū)別?
- 什么是反射機制?反射機制的應用場景有哪些?
- 談談如何重寫equals()方法?為什么還要重寫hashCode()?
- 談談你對Java泛型中類型擦除的理解,并說說其局限性?
-String為什么要設計成不可變的? - 說說你對Java注解的理解?
Java集合
- 談談List,Set,Map的區(qū)別?
- 談談ArrayList和LinkedList的區(qū)別?
- 請說一下HashMap與HashTable的區(qū)別
- 談一談ArrayList的擴容機制?
- HashMap 的實現(xiàn)原理?
- 請簡述 LinkedHashMap 的工作原理和使用方式?
- 談談對于ConcurrentHashMap的理解?
Java多線程
- Java 中使用多線程的方式有哪些?
- 說一下線程的幾種狀態(tài)?
- 如何實現(xiàn)多線程中的同步?
- 談談線程死鎖,如何有效的避免線程死鎖?
- 談談線程阻塞的原因?
- 請談談 Thread 中 run() 與 start() 的區(qū)別?
- synchronized和volatile關鍵字的區(qū)別?
- 如何保證線程安全?
- 談談ThreadLocal用法和原理?
- java線程中notify 和 notifyAll有什么區(qū)別?
- 什么是線程池?如何創(chuàng)建一個線程池?
- 談一談java線程常見的幾種鎖?
- 談一談線程sleep()和wait()的區(qū)別?
Java虛擬機
- 談一談JAVA垃圾回收機制?
- 回答一下什么是強、軟、弱、虛引用以及它們之間的區(qū)別?
- 簡述JVM中類的加載機制與加載過程?
- JVM、Dalvik、ART三者的原理和區(qū)別?
- 請談談Java的內存回收機制?
- JMM是什么?它存在哪些問題?該如何解決?
Android方面
四大組件
- Activity 與 Fragment 之間常見的幾種通信方式?
- LaunchMode 的應用場景?
- 對于 Context,你了解多少?
- IntentFilter是什么?有哪些使用場景?
- 談一談startService和bindService的區(qū)別,生命周期以及使用場景?
- Service如何進行?;??
- 簡單介紹下ContentProvider是如何實現(xiàn)數(shù)據(jù)共享的?
- 說下切換橫豎屏時Activity的生命周期?
- Intent傳輸數(shù)據(jù)的大小有限制嗎?如何解決?
Android 異步任務和消息機制
- HandlerThread 的使用場景和用法?
- IntentService 的應用場景和使用姿勢?
- AsyncTask的優(yōu)點和缺點?
- 談談你對 Activity.runOnUiThread 的理解?
- 子線程能否更新UI?為什么?
- 談談 Handler 機制和原理?
- 為什么在子線程中創(chuàng)建Handler會拋異常?
- Handler中有Loop死循環(huán),為什么沒有阻塞主線程,原理是什么?
數(shù)據(jù)結構
- 什么是冒泡排序?如何優(yōu)化?
- 請用 Java 實現(xiàn)一個簡單的單鏈表?
- 如何反轉一個單鏈表?
- 談談你對時間復雜度和空間復雜度的理解?
- 談一談如何判斷一個鏈表成環(huán)?
- 什么是紅黑樹?為什么要用紅黑樹?
- 什么是快速排序?如何優(yōu)化?
- 說說循環(huán)隊列?
- 如何判斷單鏈表交叉
Android Framework
Binder
- Binder有什么優(yōu)勢
- Binder是如何做到一次拷貝的
- MMAP的內存映射原理了解嗎
- Binder機制是如何跨進程的
- 說說四大組件的通信機制
- 為什么Intent不能傳遞大數(shù)據(jù)
Handler
- HandlerThread是什么?為什么它會存在?
- 簡述下 Handler 機制的總體原理?
- Looper 存在哪?如何可以保證線程獨有?
- 如何理解 ThreadLocal 的作用?
- 主線程 Main Looper 和一般 Looper 的異同?
- Handler 或者說 Looper 如何切換線程?
- Looper 的 loop() 死循環(huán)為什么不卡死?
- Looper 的等待是如何能夠準確喚醒的?
- Message 如何獲取?為什么這么設計?
AMS
- ActivityManagerService是什么?什么時候初始化的?有什么作用?
- ActivityThread是什么?ApplicationThread是什么?他們的區(qū)別
- Instrumentation是什么?和ActivityThread是什么關系?
- ActivityManagerService和zygote進程通信是如何實現(xiàn)的。
- ActivityRecord、TaskRecord、ActivityStack,Activi
- ActivityManager、ActivityManagerService、Activit
- 手寫實現(xiàn)簡化版AMS
算法方面
- 如何運??分查找算法
- 如何?效解決接??問題
- ?分查找?效判定?序列
- 如何去除有序數(shù)組的重復元素
- 如何尋找最?回??串
- 如何?效進?模冪運算
- 如何運用貪心思想廣域玩跳躍游戲
- 如何?效判斷回?鏈表
- 如何在無線序列中隨機抽取元素
- 如何判定括號合法性
- 如何尋找缺失和重復的元素
- 請說一說HashMap,SparseArrary原理,SparseArrary相比HashMap的優(yōu)點、ConcurrentHashMap如何實現(xiàn)線程安全?
- 請說一說HashMap原理,存取過程,為什么用紅黑樹,紅黑樹與完全二叉樹對比,HashTab、concurrentHashMap,concurrent包里有啥?
- 請說一說hashmap put()底層原理,發(fā)生沖突時,如何去添加(順著鏈表去遍歷,挨個比較key值是否一致,如果一致,就覆蓋替換,不一致遍歷結束后,插入該位置) ?
Kotlin方面
- 請簡述一下什么是 Kotlin?它有哪些特性?
- Kotlin中實現(xiàn)單例的幾種常見方式?
- 在Kotlin中,什么是內聯(lián)函數(shù)?有什么作用?
- 請談談Kotlin中的Coroutines,它與線程有什么區(qū)別?有哪些優(yōu)點?
- 說說Kotlin中的Any與Java中的Object 有何異同?
- Kotlin中的數(shù)據(jù)類型有隱式轉換嗎?為什么?
- Kotlin中集合遍歷有哪幾種方式
- Kotlin內置標準函數(shù)let的原理是什么?
- Kotlin語言的run高階函數(shù)的原理是什么?
音視頻方面
- 怎么做到直播秒開優(yōu)化?
- 數(shù)字圖像濾波有哪些方法?
- 圖像可以提取的特征有哪些?
- FFMPEG:圖片如何合成視頻
- 常見的音視頻格式有哪些?
- 請敘述MPEG視頻基本碼流結構?
- 說一說ffffmpeg的數(shù)據(jù)結構?
- 如何降低延遲?如何保證流暢性?如何解決卡頓?解決網(wǎng)絡抖動?
- 平時說的軟解和硬解,具體是什么?
Flutter方面
- Dart 語言的特性?
- Dart 多任務如何并行的?
- dart是值傳遞還是引用傳遞?
- Flutter 特性有哪些?
- Widget 和 element 和 RenderObject 之間的關系?
- 使用mixins的條件是什么?
- Stream 兩種訂閱模式?
- Flutter中的Widget、State、Context 的核心概念?是為了解決什么問題?
- 說一下Hot Reload,Hot Restart,熱更新三者的區(qū)別和原理
- Flutter 如何與 Android iOS 通信?
- 說一下什么是狀態(tài)管理,為什么需要它?
結語
希望這份面試題,能幫助大家把握住機會,找到自己心儀的工作??!
整理不易,想要進階或者是更多面試題,查看我的個人簡介,說不定就有你需要的