又到年底了,每到這個(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)
- 容器(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
- 內(nèi)存模型
參考鏈接
理解Java內(nèi)存模型
你了解Java內(nèi)存模型么(Java7、8、9內(nèi)存模型的區(qū)別)
- 垃圾回收算法(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ū)別?
參考鏈接
- 類加載過程(需要多看看,重在理解,對(duì)于熱修復(fù)和插件化比較重要)
- 反射
- 多線程和線程池
線程有哪些狀態(tài),哪些鎖,各種鎖的區(qū)別
并發(fā)編程:
synchronized 和 volatile 、ReentrantLock 、CAS 的區(qū)別
synchronized 修飾實(shí)例方法和修飾靜態(tài)方法有啥不一樣。
sleep 、wait、yield 的區(qū)別,wait 的線程如何喚醒它
- 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ā)包頻率是怎么樣的?
- 設(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ū)更新?)
- 斷點(diǎn)續(xù)傳
- Java 四大引用
強(qiáng)引用、軟引用、弱引用、虛引用的區(qū)別以及使用場(chǎng)景。
強(qiáng)引用置為 null,會(huì)不會(huì)被回收?
稍微問的深一些的面試官會(huì)和內(nèi)存泄漏檢測(cè)原理以及垃圾回收糅雜在一起。
- Java 的泛型,<? super T> 和 <? extends T> 的區(qū)別
問到泛型、泛型擦除、通配符相關(guān)的東西
- final、finally、finalize 的區(qū)別
- 接口、抽象類的區(qū)別
2、Android 相關(guān)
-
自定義 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)
- 事件攔截分發(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ī)。
- 解決過的一些性能問題,在項(xiàng)目中的實(shí)際運(yùn)用。
-
性能優(yōu)化工具
(TraceView、Systrace、調(diào)試 GPU 過度繪制 & GPU 呈現(xiàn)模式分析、Hierarchy Viewer、MAT、Memory Monitor & Heap Viewer & Allocation Tracker 等)
-
性能優(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)
- 緩存自己如何實(shí)現(xiàn)(LRUCache 原理)
- 圖形圖像相關(guān):OpenGL ES 管線流程、EGL 的認(rèn)識(shí)、Shader 相關(guān)
- SurfaceView、TextureView、GLSurfaceView 區(qū)別及使用場(chǎng)景
- 動(dòng)畫、差值器、估值器(Android中的View動(dòng)畫和屬性動(dòng)畫 - 簡(jiǎn)書、Android 動(dòng)畫 介紹與使用)
屬性動(dòng)畫、補(bǔ)間動(dòng)畫、幀動(dòng)畫的區(qū)別和使用場(chǎng)景
- MVC、MVP、MVVM
相互間的區(qū)別和各種使用場(chǎng)景,如何選擇適合自己的開發(fā)架構(gòu)。
- Handler、ThreadLocal、AsyncTask、IntentService 原理及應(yīng)用
Handler 機(jī)制原理,IdleHandler 什么時(shí)候調(diào)用。
Gradle(Groovy 語(yǔ)法、Gradle 插件開發(fā)基礎(chǔ))
熱修復(fù)、插件化
(1、談?wù)剬?duì) ClassLoader 的理解
2、雙親委托機(jī)制的好處
3、自定義 ClassLoader
4、插件化為什么會(huì)出現(xiàn),如何代碼加載,資源加載,代理 Hook)Activity 生命周期;
Android 的 4 大啟動(dòng)模式,注意 onNewIntent() 的調(diào)用。
講講 Android 的四大組件;
組件化架構(gòu)思路
1、如何從一個(gè)老項(xiàng)目一步步實(shí)現(xiàn)組件化,主要問思路,考察架構(gòu)能力和思考能力。(需要考慮很多,每一步做什么,順序很重要)
2、組件化和模塊化的理解與區(qū)別?系統(tǒng)打包流程
Android 有哪些存儲(chǔ)數(shù)據(jù)的方式。
SharedPrefrence 源碼和問題點(diǎn);
sqlite 相關(guān)
1、sqlite 升級(jí),增加字段的語(yǔ)句
2、數(shù)據(jù)庫(kù)框架對(duì)比和源碼分析
3、數(shù)據(jù)庫(kù)優(yōu)化及數(shù)據(jù)遷移問題
4、getWritableDatabase 和 getReadableDatabase 的區(qū)別ListView 和 RecyclerView 區(qū)別?RecyclerView 有幾層緩存,如何讓兩個(gè) RecyclerView 共用一個(gè)緩存?
1、RecycleView 如何進(jìn)行局部刷新。
2、性能優(yōu)化。如何判斷一個(gè) APP 在前臺(tái)還是后臺(tái)?
如何做應(yīng)用?;?/strong>?全家桶原理?
混合開發(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
- AMS 、PMS
- Activity 啟動(dòng)流程,App 啟動(dòng)流程
-
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é)程? - 為什么使用 Parcelable,好處是什么?
- Android 圖像顯示相關(guān)流程,Vsync 信號(hào)等
4、三方源碼
-
Glide :加載、緩存、LRU 算法
(如何自己設(shè)計(jì)一個(gè)大圖加載框架)
(LRUCache 原理) - EventBus
- LeakCanary
- ARouter
重點(diǎn):Router 原理,如何實(shí)現(xiàn)組件間的通信,組件化平級(jí)調(diào)用數(shù)據(jù)的方式。
- 插件化(不同插件化機(jī)制原理與流派,優(yōu)缺點(diǎn)。局限性)
- 熱修復(fù)
-
RXJava
(RxJava 的線程切換原理) -
Retrofit
(Retrofit 在 OkHttp 上做了哪些封裝?動(dòng)態(tài)代理和靜態(tài)代理的區(qū)別,是怎么實(shí)現(xiàn)的) - OkHttp 和 Volley 的區(qū)別。
1、OkHttp 源碼,網(wǎng)絡(luò)緩存
2、如果從網(wǎng)絡(luò)加載一個(gè) 10M 的圖片,說下注意事項(xiàng)
3、安卓為啥要加簽名機(jī)制
5、算法與數(shù)據(jù)結(jié)構(gòu)
單鏈表:反轉(zhuǎn)、插入、刪除
雙鏈表:插入、刪除
手寫常見排序、歸并排序、堆排序
二叉樹前序、中序、后序遍歷
最大 K 問題
廣度、深度優(yōu)先搜索算法
可以去刷一下 LeetCode ,對(duì)自己提升也會(huì)比較大。
String 轉(zhuǎn) int。
核心算法就三行代碼,不過臨界條件很多,除了判空,還需要注意負(fù)數(shù)、Integer 的最大最小值邊界等;如何判斷一個(gè)單鏈表有環(huán)?
鏈表翻轉(zhuǎn);
快排;
100 億個(gè)單詞,找出出現(xiàn)頻率最高的單詞。要求幾種方案;
鏈表每 k 位逆序;
鏡像二叉樹;
找出一個(gè)無序數(shù)組中出現(xiàn)超過一半次數(shù)的數(shù)字;
計(jì)算二叉樹的最大深度,要求非遞歸算法。
String 方式計(jì)算加法。
6、項(xiàng)目 & HR
- 項(xiàng)目開發(fā)中遇到的最大的一個(gè)難題和挑戰(zhàn),你是如何解決的。(95% 會(huì)問到)
- 說說你開發(fā)最大的優(yōu)勢(shì)點(diǎn)(95% 會(huì)問到)
- 你為什么會(huì)離開上家公司
- 你的缺點(diǎn)是什么?
- 你能給公司帶來什么效益?
- 你對(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)系我或注明出處!
