Android 中高級(jí)面試必知必會(huì)

又到年底了,每到這個(gè)時(shí)候,我們都會(huì)慢慢反思,這一年都做了什么?有什么進(jìn)步?年初的計(jì)劃都實(shí)現(xiàn)了嗎?明年年初有跳槽的底氣了嗎?況且今年的互聯(lián)網(wǎng)環(huán)境太差,需要自己有足夠的知識(shí)儲(chǔ)備,才能夠應(yīng)對(duì)這凌冽的寒風(fēng)。

本文主要是整理了中高級(jí)安卓需要會(huì)的(或者說面試被頻繁問到的內(nèi)容),主要作為參考大綱,之后會(huì)陸續(xù)更新每個(gè)詳細(xì)部分,供大家參考,互相學(xué)習(xí)。

1、Java 相關(guān)

  1. 容器(HashMap、HashSet、LinkedList、ArrayList、數(shù)組等)

需要了解其實(shí)現(xiàn)原理,還要靈活運(yùn)用,如:自己實(shí)現(xiàn) LinkedList、兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列,數(shù)組實(shí)現(xiàn)棧,隊(duì)列實(shí)現(xiàn)棧等。

HashMap、HashTable 和 CurrentHashMap 的核心區(qū)別(并發(fā)),其次內(nèi)部數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)、擴(kuò)容、存取操作,再深一點(diǎn) 哈希碰撞,哈希計(jì)算,哈希映射,為什么是頭插法,擴(kuò)容為什么是 2 的冪次等。

參考鏈接

JAVA容器-自問自答學(xué)HashMap
什么是HashMap?
從源碼角度認(rèn)識(shí)ArrayList,LinkedList與HashMap

  1. 內(nèi)存模型

參考鏈接

理解Java內(nèi)存模型
你了解Java內(nèi)存模型么(Java7、8、9內(nèi)存模型的區(qū)別)

  1. 垃圾回收算法(JVM)
JVM 類加載機(jī)制、垃圾回收算法對(duì)比、Java 虛擬機(jī)結(jié)構(gòu)

當(dāng)你講到分代回收算法的時(shí)候,不免會(huì)被追問到新生對(duì)象是怎么從年輕代到老年代的,以及可以作為 root 結(jié)點(diǎn)的對(duì)象有哪些兩個(gè)問題。

1、談?wù)剬?duì) JVM 的理解?
2、JVM 內(nèi)存區(qū)域,開線程影響哪塊區(qū)域內(nèi)存?
3、對(duì) Dalvik、ART 虛擬機(jī)有什么了解?對(duì)比?

ART 的機(jī)制與 Dalvik 不同。在Dalvik下,應(yīng)用每次運(yùn)行的時(shí)候,字節(jié)碼都需要通過即時(shí)編譯器(just in time ,JIT)轉(zhuǎn)換為機(jī)器碼,這會(huì)拖慢應(yīng)用的運(yùn)行效率,而在ART 環(huán)境中,應(yīng)用在第一次安裝的時(shí)候,字節(jié)碼就會(huì)預(yù)先編譯成機(jī)器碼,極大的提高了程序的運(yùn)行效率,同時(shí)減少了手機(jī)的耗電量,使其成為真正的本地應(yīng)用。這個(gè)過程叫做預(yù)編譯(AOT,Ahead-Of-Time)。這樣的話,應(yīng)用的啟動(dòng)(首次)和執(zhí)行都會(huì)變得更加快速。

優(yōu)點(diǎn):

  • 系統(tǒng)性能的顯著提升。
  • 應(yīng)用啟動(dòng)更快、運(yùn)行更快、體驗(yàn)更流暢、觸感反饋更及時(shí)。
  • 更長(zhǎng)的電池續(xù)航能力。
  • 支持更低的硬件。

缺點(diǎn):

  • 機(jī)器碼占用的存儲(chǔ)空間更大,字節(jié)碼變?yōu)闄C(jī)器碼之后,可能會(huì)增加10%-20%(不過在應(yīng)用包中,可執(zhí)行的代碼常常只是一部分。比如最新的 Google+ APK 是 28.3 MB,但是代碼只有 6.9 MB。)
  • 應(yīng)用的安裝時(shí)間會(huì)變長(zhǎng)。

4、垃圾回收機(jī)制和調(diào)用 System.gc()的區(qū)別?

參考鏈接

Java虛擬機(jī)(JVM)你只要看這一篇就夠了!

  1. 類加載過程(需要多看看,重在理解,對(duì)于熱修復(fù)和插件化比較重要)
  2. 反射
  3. 多線程和線程池
線程有哪些狀態(tài),哪些鎖,各種鎖的區(qū)別

并發(fā)編程:
synchronized 和 volatile 、ReentrantLock 、CAS 的區(qū)別

synchronized 修飾實(shí)例方法和修飾靜態(tài)方法有啥不一樣。

sleep 、wait、yield 的區(qū)別,wait 的線程如何喚醒它

  1. HTTP、HTTPS、TCP/IP、Socket通信、三次握手四次揮手過程
計(jì)算機(jī)網(wǎng)絡(luò)部分:
1、TCP 有哪些狀態(tài)
2、三次握手、四次揮手。為啥不是三次不是兩次
3、HTTPS 和 HTTP 的區(qū)別,HTTPS 2.0 3.0?
4、瀏覽器輸入一個(gè) URL 按下回車網(wǎng)絡(luò)傳輸?shù)牧鞒蹋?5、問的深一點(diǎn)的可能涉及到網(wǎng)絡(luò)架構(gòu),每層有什么協(xié)議,F(xiàn)TP 相關(guān)原理,例:TCP 建立連接后,發(fā)包頻率是怎么樣的?

  1. 設(shè)計(jì)模式(六大基本原則、項(xiàng)目中常用的設(shè)計(jì)模式、手寫單例等)
1、生產(chǎn)者模式和消費(fèi)者模式的區(qū)別?
2、單例模式雙重加鎖,為什么這樣做?
3、知道的設(shè)計(jì)模式有哪些?
4、項(xiàng)目中常用的設(shè)計(jì)模式有哪些?
5、手寫生產(chǎn)者、消費(fèi)者模式。
6、手寫觀察者模式代碼。
7、適配器模式、裝飾者模式、外觀模式的異同?
8、談?wù)剬?duì) java 狀態(tài)機(jī)的理解。
9、談?wù)剳?yīng)用更新(灰度、強(qiáng)制更新、分區(qū)更新?)
  1. 斷點(diǎn)續(xù)傳
  2. Java 四大引用
強(qiáng)引用、軟引用、弱引用、虛引用的區(qū)別以及使用場(chǎng)景。

強(qiáng)引用置為 null,會(huì)不會(huì)被回收?

稍微問的深一些的面試官會(huì)和內(nèi)存泄漏檢測(cè)原理以及垃圾回收糅雜在一起。

  1. Java 的泛型,<? super T> 和 <? extends T> 的區(qū)別
問到泛型、泛型擦除、通配符相關(guān)的東西
  1. final、finally、finalize 的區(qū)別
  2. 接口、抽象類的區(qū)別

2、Android 相關(guān)

  1. 自定義 View
    1、ViewGroup 繪制順序 (例:自定義 ViewGroup 如何實(shí)現(xiàn) FlowLayout?如何實(shí)現(xiàn) FlowLayout 調(diào)換順序)
    2、 自定義 View 如何實(shí)現(xiàn)打桌球效果;
    3、 自定義 View 如何實(shí)現(xiàn)拉弓效果,貝瑟爾曲線原理實(shí)現(xiàn)?

(參考鏈接:自定義View,有這一篇就夠了 - 簡(jiǎn)書、Android 自定義 View

  1. 事件攔截分發(fā)(Android事件分發(fā)機(jī)制,大表哥帶你慢慢深入 - 簡(jiǎn)書 )
事件分發(fā)已經(jīng)不是直接讓你講了,會(huì)給你具體的場(chǎng)景,比如 A 嵌套 B ,B 嵌套 C,從 C 中心按下,一下滑出到 A,事件分發(fā)的過程,這里面肯定會(huì)有 ACTION_CANCEL 的相關(guān)調(diào)用時(shí)機(jī)。
  1. 解決過的一些性能問題,在項(xiàng)目中的實(shí)際運(yùn)用。
  2. 性能優(yōu)化工具
    (TraceView、Systrace、調(diào)試 GPU 過度繪制 & GPU 呈現(xiàn)模式分析、Hierarchy Viewer、MAT、Memory Monitor & Heap Viewer & Allocation Tracker 等)
  1. 性能優(yōu)化 (講講你自己項(xiàng)目中做過的性能優(yōu)化)
    (1)網(wǎng)絡(luò):API 優(yōu)化、流量?jī)?yōu)化、弱網(wǎng)優(yōu)化
    (2)內(nèi)存:OOM 處理、內(nèi)存泄漏、內(nèi)存檢測(cè)、分析、Bitmap 優(yōu)化
    LeakCanary 原理,為什么檢測(cè)內(nèi)存泄漏需要兩次?
    (3)繪制
    (4)電量:WeakLock 機(jī)制、JobScheduler 機(jī)制
    (5)APK 瘦身
    (APK 瘦身是怎么做的,只用 armabi-v7a 沒有什么問題么?
    APK 瘦身這個(gè)基本是 100% 被面試問到,可能是我簡(jiǎn)歷上提到的原因。)
    (6)內(nèi)存抖動(dòng)
    (7)內(nèi)存泄漏
    (8)卡頓 {如何檢測(cè)卡頓,卡頓原理是什么,怎么判斷頁(yè)面響應(yīng)卡頓還是邏輯處理造成的卡頓}
    BlockCanary 的原理
    (9)性能優(yōu)化:布局優(yōu)化、過度渲染處理、ANR 處理、監(jiān)控、埋點(diǎn)、Crash 上傳。
    (10)啟動(dòng)優(yōu)化
冷啟動(dòng)什么的肯定是基礎(chǔ),后續(xù)應(yīng)該還有的是懶加載,丟線程池同步處理,需要注意這里可能會(huì)有的坑是,丟線程池如何知道全部完成。

問題
1、啟動(dòng)頁(yè)白屏及黑屏解決?
2、啟動(dòng)太慢如何解決?
3、啟動(dòng)崩潰捕捉?
4、Https 請(qǐng)求慢的解決辦法(DNS、攜帶數(shù)據(jù)、直接訪問 IP)

  1. 緩存自己如何實(shí)現(xiàn)(LRUCache 原理)
  2. 圖形圖像相關(guān):OpenGL ES 管線流程、EGL 的認(rèn)識(shí)、Shader 相關(guān)
  3. SurfaceView、TextureView、GLSurfaceView 區(qū)別及使用場(chǎng)景
  4. 動(dòng)畫、差值器、估值器Android中的View動(dòng)畫和屬性動(dòng)畫 - 簡(jiǎn)書、Android 動(dòng)畫 介紹與使用
屬性動(dòng)畫、補(bǔ)間動(dòng)畫、幀動(dòng)畫的區(qū)別和使用場(chǎng)景
  1. MVC、MVP、MVVM
相互間的區(qū)別和各種使用場(chǎng)景,如何選擇適合自己的開發(fā)架構(gòu)。
  1. Handler、ThreadLocal、AsyncTask、IntentService 原理及應(yīng)用
Handler 機(jī)制原理,IdleHandler 什么時(shí)候調(diào)用。
  1. Gradle(Groovy 語(yǔ)法、Gradle 插件開發(fā)基礎(chǔ))

  2. 熱修復(fù)、插件化
    (1、談?wù)剬?duì) ClassLoader 的理解
    2、雙親委托機(jī)制的好處
    3、自定義 ClassLoader
    4、插件化為什么會(huì)出現(xiàn),如何代碼加載,資源加載,代理 Hook)

  3. Activity 生命周期;

  4. Android 的 4 大啟動(dòng)模式,注意 onNewIntent() 的調(diào)用。

  5. 講講 Android 的四大組件;

  6. 組件化架構(gòu)思路
    1、如何從一個(gè)老項(xiàng)目一步步實(shí)現(xiàn)組件化,主要問思路,考察架構(gòu)能力和思考能力。(需要考慮很多,每一步做什么,順序很重要)
    2、組件化和模塊化的理解與區(qū)別?

  7. 系統(tǒng)打包流程

  8. Android 有哪些存儲(chǔ)數(shù)據(jù)的方式。

  9. SharedPrefrence 源碼和問題點(diǎn);

  10. sqlite 相關(guān)
    1、sqlite 升級(jí),增加字段的語(yǔ)句
    2、數(shù)據(jù)庫(kù)框架對(duì)比和源碼分析
    3、數(shù)據(jù)庫(kù)優(yōu)化及數(shù)據(jù)遷移問題
    4、getWritableDatabase 和 getReadableDatabase 的區(qū)別

  11. ListViewRecyclerView 區(qū)別?RecyclerView 有幾層緩存,如何讓兩個(gè) RecyclerView 共用一個(gè)緩存?
    1、RecycleView 如何進(jìn)行局部刷新。
    2、性能優(yōu)化。

  12. 如何判斷一個(gè) APP 在前臺(tái)還是后臺(tái)?

  13. 如何做應(yīng)用?;?/strong>?全家桶原理?

  14. 混合開發(fā)
    1、 Hybrid 做過嗎? :Android 通過WebView調(diào)用 JS 代碼 :JS 通過WebView調(diào)用 Android 代碼;
    2、Hybrid 通信原理是什么,有做研究嗎?
    3、說說你用過的混合開發(fā)技術(shù)有哪些?各有什么優(yōu)缺點(diǎn)?

3、Android Framework

  1. AMS 、PMS
  2. Activity 啟動(dòng)流程,App 啟動(dòng)流程
  3. Binder 機(jī)制(IPC、AIDL 的使用)
    (講講 Linux 上的 IPC 通信,Binder 有什么優(yōu)勢(shì),Android 上有哪些多進(jìn)程通信機(jī)制?)
    1、項(xiàng)目中遇見了什么多進(jìn)程場(chǎng)景?
    2、AIDL 是什么?解決了什么問題?
    3、談?wù)剬?duì)進(jìn)程共享和線程安全的認(rèn)知?
    4、什么是協(xié)程?
  4. 為什么使用 Parcelable,好處是什么?
  5. Android 圖像顯示相關(guān)流程,Vsync 信號(hào)等

4、三方源碼

  1. Glide :加載、緩存、LRU 算法
    (如何自己設(shè)計(jì)一個(gè)大圖加載框架)
    (LRUCache 原理)
  2. EventBus
  3. LeakCanary
  4. ARouter
重點(diǎn):Router 原理,如何實(shí)現(xiàn)組件間的通信,組件化平級(jí)調(diào)用數(shù)據(jù)的方式。
  1. 插件化(不同插件化機(jī)制原理與流派,優(yōu)缺點(diǎn)。局限性)
  2. 熱修復(fù)
  3. RXJava
    (RxJava 的線程切換原理)
  4. Retrofit
    (Retrofit 在 OkHttp 上做了哪些封裝?動(dòng)態(tài)代理和靜態(tài)代理的區(qū)別,是怎么實(shí)現(xiàn)的)
  5. OkHttp 和 Volley 的區(qū)別。
    1、OkHttp 源碼,網(wǎng)絡(luò)緩存
    2、如果從網(wǎng)絡(luò)加載一個(gè) 10M 的圖片,說下注意事項(xiàng)
    3、安卓為啥要加簽名機(jī)制

5、算法與數(shù)據(jù)結(jié)構(gòu)

  1. 單鏈表:反轉(zhuǎn)、插入、刪除

  2. 雙鏈表:插入、刪除

  3. 手寫常見排序、歸并排序、堆排序

  4. 二叉樹前序、中序、后序遍歷

  5. 最大 K 問題

  6. 廣度、深度優(yōu)先搜索算法

  7. 可以去刷一下 LeetCode ,對(duì)自己提升也會(huì)比較大。

  8. String 轉(zhuǎn) int。
    核心算法就三行代碼,不過臨界條件很多,除了判空,還需要注意負(fù)數(shù)、Integer 的最大最小值邊界等;

  9. 如何判斷一個(gè)單鏈表有環(huán)?

  10. 鏈表翻轉(zhuǎn);

  11. 快排;

  12. 100 億個(gè)單詞,找出出現(xiàn)頻率最高的單詞。要求幾種方案;

  13. 鏈表每 k 位逆序;

  14. 鏡像二叉樹;

  15. 找出一個(gè)無序數(shù)組中出現(xiàn)超過一半次數(shù)的數(shù)字;

  16. 計(jì)算二叉樹的最大深度,要求非遞歸算法。

  17. String 方式計(jì)算加法。

6、項(xiàng)目 & HR

  1. 項(xiàng)目開發(fā)中遇到的最大的一個(gè)難題和挑戰(zhàn),你是如何解決的。(95% 會(huì)問到)
  2. 說說你開發(fā)最大的優(yōu)勢(shì)點(diǎn)(95% 會(huì)問到)
  3. 你為什么會(huì)離開上家公司
  4. 你的缺點(diǎn)是什么?
  5. 你能給公司帶來什么效益?
  6. 你對(duì)未來的職業(yè)規(guī)劃?

下次更新內(nèi)容章節(jié)為 Java 中的集合,我會(huì)根據(jù)內(nèi)容多少?zèng)Q定分幾篇文章去講,大致內(nèi)容如我整理腦圖

為避免失聯(lián)或想第一時(shí)間查看我的文章更新,可關(guān)注我的微信公眾號(hào) KevenZheng ,之后會(huì)陸續(xù)更新上述目錄的內(nèi)容,敬請(qǐng)關(guān)注。

如需轉(zhuǎn)載,請(qǐng)聯(lián)系我或注明出處!


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容