又到年底了,每到這個時候驰唬,我們都會慢慢反思顶岸,這一年都做了什么?有什么進(jìn)步叫编?年初的計劃都實現(xiàn)了嗎辖佣?明年年初有跳槽的底氣了嗎?況且今年的互聯(lián)網(wǎng)環(huán)境太差搓逾,需要自己有足夠的知識儲備卷谈,才能夠應(yīng)對這凌冽的寒風(fēng)。
本文主要是整理了中高級安卓需要會的(或者說面試被頻繁問到的內(nèi)容)霞篡,主要作為參考大綱世蔗,之后會陸續(xù)更新每個詳細(xì)部分,供大家參考朗兵,互相學(xué)習(xí)污淋。
1、Java 相關(guān)
- 容器(HashMap余掖、HashSet寸爆、LinkedList、ArrayList、數(shù)組等)
需要了解其實現(xiàn)原理赁豆,還要靈活運用仅醇,如:自己實現(xiàn) LinkedList、兩個棧實現(xiàn)一個隊列魔种,數(shù)組實現(xiàn)棧析二,隊列實現(xiàn)棧等。
HashMap节预、HashTable 和 CurrentHashMap 的核心區(qū)別(并發(fā))叶摄,其次內(nèi)部數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)、擴容心铃、存取操作准谚,再深一點 哈希碰撞,哈希計算去扣,哈希映射柱衔,為什么是頭插法,擴容為什么是 2 的冪次等愉棱。
參考鏈接
JAVA容器-自問自答學(xué)HashMap
什么是HashMap唆铐?
從源碼角度認(rèn)識ArrayList,LinkedList與HashMap
- 內(nèi)存模型
參考鏈接
理解Java內(nèi)存模型
你了解Java內(nèi)存模型么(Java7奔滑、8艾岂、9內(nèi)存模型的區(qū)別)
- 垃圾回收算法(JVM)
JVM 類加載機制、垃圾回收算法對比朋其、Java 虛擬機結(jié)構(gòu)
當(dāng)你講到分代回收算法的時候王浴,不免會被追問到新生對象是怎么從年輕代到老年代的,以及可以作為 root 結(jié)點的對象有哪些兩個問題梅猿。
1氓辣、談?wù)剬?JVM 的理解?
2、JVM 內(nèi)存區(qū)域袱蚓,開線程影響哪塊區(qū)域內(nèi)存钞啸?
3、對 Dalvik喇潘、ART 虛擬機有什么了解体斩?對比?
ART 的機制與 Dalvik 不同颖低。在Dalvik下絮吵,應(yīng)用每次運行的時候,字節(jié)碼都需要通過即時編譯器(just in time 忱屑,JIT)轉(zhuǎn)換為機器碼源武,這會拖慢應(yīng)用的運行效率扼褪,而在ART 環(huán)境中想幻,應(yīng)用在第一次安裝的時候粱栖,字節(jié)碼就會預(yù)先編譯成機器碼,極大的提高了程序的運行效率脏毯,同時減少了手機的耗電量闹究,使其成為真正的本地應(yīng)用。這個過程叫做預(yù)編譯(AOT,Ahead-Of-Time)食店。這樣的話渣淤,應(yīng)用的啟動(首次)和執(zhí)行都會變得更加快速。
優(yōu)點:
- 系統(tǒng)性能的顯著提升吉嫩。
- 應(yīng)用啟動更快价认、運行更快、體驗更流暢自娩、觸感反饋更及時用踩。
- 更長的電池續(xù)航能力。
- 支持更低的硬件忙迁。
缺點:
- 機器碼占用的存儲空間更大脐彩,字節(jié)碼變?yōu)闄C器碼之后,可能會增加10%-20%(不過在應(yīng)用包中姊扔,可執(zhí)行的代碼常常只是一部分惠奸。比如最新的 Google+ APK 是 28.3 MB,但是代碼只有 6.9 MB恰梢。)
- 應(yīng)用的安裝時間會變長佛南。
4、垃圾回收機制和調(diào)用 System.gc()的區(qū)別嵌言?
參考鏈接
- 類加載過程(需要多看看,重在理解呀页,對于熱修復(fù)和插件化比較重要)
- 反射
- 多線程和線程池
線程有哪些狀態(tài)妈拌,哪些鎖,各種鎖的區(qū)別
并發(fā)編程:
synchronized 和 volatile 蓬蝶、ReentrantLock 尘分、CAS 的區(qū)別
synchronized 修飾實例方法和修飾靜態(tài)方法有啥不一樣。
sleep 丸氛、wait培愁、yield 的區(qū)別,wait 的線程如何喚醒它
- HTTP缓窜、HTTPS定续、TCP/IP谍咆、Socket通信、三次握手四次揮手過程
計算機網(wǎng)絡(luò)部分:
1私股、TCP 有哪些狀態(tài)
2摹察、三次握手、四次揮手倡鲸。為啥不是三次不是兩次
3供嚎、HTTPS 和 HTTP 的區(qū)別,HTTPS 2.0 3.0峭状?
4克滴、瀏覽器輸入一個 URL 按下回車網(wǎng)絡(luò)傳輸?shù)牧鞒蹋?5、問的深一點的可能涉及到網(wǎng)絡(luò)架構(gòu)优床,每層有什么協(xié)議劝赔,F(xiàn)TP 相關(guān)原理,例:TCP 建立連接后胆敞,發(fā)包頻率是怎么樣的着帽?
- 設(shè)計模式(六大基本原則、項目中常用的設(shè)計模式竿秆、手寫單例等)
1启摄、生產(chǎn)者模式和消費者模式的區(qū)別?
2幽钢、單例模式雙重加鎖歉备,為什么這樣做?
3匪燕、知道的設(shè)計模式有哪些蕾羊?
4、項目中常用的設(shè)計模式有哪些帽驯?
5龟再、手寫生產(chǎn)者、消費者模式尼变。
6利凑、手寫觀察者模式代碼。
7嫌术、適配器模式哀澈、裝飾者模式、外觀模式的異同度气?
8割按、談?wù)剬?java 狀態(tài)機的理解。
9磷籍、談?wù)剳?yīng)用更新(灰度适荣、強制更新现柠、分區(qū)更新?)
- 斷點續(xù)傳
- Java 四大引用
強引用弛矛、軟引用够吩、弱引用、虛引用的區(qū)別以及使用場景汪诉。
強引用置為 null废恋,會不會被回收?
稍微問的深一些的面試官會和內(nèi)存泄漏檢測原理以及垃圾回收糅雜在一起扒寄。
- Java 的泛型,<? super T> 和 <? extends T> 的區(qū)別
問到泛型拟烫、泛型擦除该编、通配符相關(guān)的東西
- final、finally硕淑、finalize 的區(qū)別
- 接口课竣、抽象類的區(qū)別
2、Android 相關(guān)
-
自定義 View
1置媳、ViewGroup 繪制順序 (例:自定義 ViewGroup 如何實現(xiàn) FlowLayout于樟?如何實現(xiàn) FlowLayout 調(diào)換順序)
2、 自定義 View 如何實現(xiàn)打桌球效果拇囊;
3迂曲、 自定義 View 如何實現(xiàn)拉弓效果,貝瑟爾曲線原理實現(xiàn)寥袭?
(參考鏈接:自定義View路捧,有這一篇就夠了 - 簡書、Android 自定義 View)
- 事件攔截分發(fā)(Android事件分發(fā)機制传黄,大表哥帶你慢慢深入 - 簡書 )
事件分發(fā)已經(jīng)不是直接讓你講了杰扫,會給你具體的場景,比如 A 嵌套 B 膘掰,B 嵌套 C章姓,從 C 中心按下,一下滑出到 A识埋,事件分發(fā)的過程凡伊,這里面肯定會有 ACTION_CANCEL 的相關(guān)調(diào)用時機。
- 解決過的一些性能問題惭聂,在項目中的實際運用窗声。
-
性能優(yōu)化工具
(TraceView、Systrace辜纲、調(diào)試 GPU 過度繪制 & GPU 呈現(xiàn)模式分析笨觅、Hierarchy Viewer拦耐、MAT、Memory Monitor & Heap Viewer & Allocation Tracker 等)
-
性能優(yōu)化 (講講你自己項目中做過的性能優(yōu)化)
(1)網(wǎng)絡(luò):API 優(yōu)化见剩、流量優(yōu)化杀糯、弱網(wǎng)優(yōu)化
(2)內(nèi)存:OOM 處理、內(nèi)存泄漏苍苞、內(nèi)存檢測固翰、分析、Bitmap 優(yōu)化
LeakCanary 原理羹呵,為什么檢測內(nèi)存泄漏需要兩次骂际?
(3)繪制
(4)電量:WeakLock 機制、JobScheduler 機制
(5)APK 瘦身
(APK 瘦身是怎么做的冈欢,只用 armabi-v7a 沒有什么問題么歉铝?
APK 瘦身這個基本是 100% 被面試問到,可能是我簡歷上提到的原因凑耻。)
(6)內(nèi)存抖動
(7)內(nèi)存泄漏
(8)卡頓 {如何檢測卡頓太示,卡頓原理是什么,怎么判斷頁面響應(yīng)卡頓還是邏輯處理造成的卡頓}
BlockCanary 的原理
(9)性能優(yōu)化:布局優(yōu)化香浩、過度渲染處理类缤、ANR 處理、監(jiān)控邻吭、埋點餐弱、Crash 上傳。
(10)啟動優(yōu)化
冷啟動什么的肯定是基礎(chǔ)镜盯,后續(xù)應(yīng)該還有的是懶加載岸裙,丟線程池同步處理,需要注意這里可能會有的坑是速缆,丟線程池如何知道全部完成降允。
問題:
1、啟動頁白屏及黑屏解決艺糜?
2剧董、啟動太慢如何解決?
3破停、啟動崩潰捕捉翅楼?
4、Https 請求慢的解決辦法(DNS真慢、攜帶數(shù)據(jù)毅臊、直接訪問 IP)
- 緩存自己如何實現(xiàn)(LRUCache 原理)
- 圖形圖像相關(guān):OpenGL ES 管線流程、EGL 的認(rèn)識黑界、Shader 相關(guān)
- SurfaceView管嬉、TextureView皂林、GLSurfaceView 區(qū)別及使用場景
- 動畫、差值器蚯撩、估值器(Android中的View動畫和屬性動畫 - 簡書础倍、Android 動畫 介紹與使用)
屬性動畫、補間動畫胎挎、幀動畫的區(qū)別和使用場景
- MVC沟启、MVP、MVVM
相互間的區(qū)別和各種使用場景犹菇,如何選擇適合自己的開發(fā)架構(gòu)德迹。
- Handler、ThreadLocal项栏、AsyncTask浦辨、IntentService 原理及應(yīng)用
Handler 機制原理,IdleHandler 什么時候調(diào)用沼沈。
Gradle(Groovy 語法、Gradle 插件開發(fā)基礎(chǔ))
熱修復(fù)币厕、插件化
(1列另、談?wù)剬?ClassLoader 的理解
2、雙親委托機制的好處
3旦装、自定義 ClassLoader
4页衙、插件化為什么會出現(xiàn),如何代碼加載阴绢,資源加載店乐,代理 Hook)Activity 生命周期;
Android 的 4 大啟動模式呻袭,注意 onNewIntent() 的調(diào)用眨八。
講講 Android 的四大組件;
組件化架構(gòu)思路
1左电、如何從一個老項目一步步實現(xiàn)組件化廉侧,主要問思路,考察架構(gòu)能力和思考能力篓足。(需要考慮很多段誊,每一步做什么,順序很重要)
2栈拖、組件化和模塊化的理解與區(qū)別连舍?系統(tǒng)打包流程
Android 有哪些存儲數(shù)據(jù)的方式。
SharedPrefrence 源碼和問題點涩哟;
sqlite 相關(guān)
1索赏、sqlite 升級盼玄,增加字段的語句
2、數(shù)據(jù)庫框架對比和源碼分析
3参滴、數(shù)據(jù)庫優(yōu)化及數(shù)據(jù)遷移問題
4强岸、getWritableDatabase 和 getReadableDatabase 的區(qū)別ListView 和 RecyclerView 區(qū)別?RecyclerView 有幾層緩存砾赔,如何讓兩個 RecyclerView 共用一個緩存蝌箍?
1、RecycleView 如何進(jìn)行局部刷新暴心。
2妓盲、性能優(yōu)化。如何判斷一個 APP 在前臺還是后臺专普?
如何做應(yīng)用泵醭模活?全家桶原理檀夹?
混合開發(fā)
1筋粗、 Hybrid 做過嗎? 例:Android 通過WebView調(diào)用 JS 代碼 例:JS 通過WebView調(diào)用 Android 代碼炸渡;
2娜亿、Hybrid 通信原理是什么,有做研究嗎蚌堵?
3买决、說說你用過的混合開發(fā)技術(shù)有哪些?各有什么優(yōu)缺點吼畏?
3督赤、Android Framework
- AMS 、PMS
- Activity 啟動流程泻蚊,App 啟動流程
-
Binder 機制(IPC躲舌、AIDL 的使用)
(講講 Linux 上的 IPC 通信,Binder 有什么優(yōu)勢藕夫,Android 上有哪些多進(jìn)程通信機制?)
1孽糖、項目中遇見了什么多進(jìn)程場景?
2毅贮、AIDL 是什么办悟?解決了什么問題?
3滩褥、談?wù)剬M(jìn)程共享和線程安全的認(rèn)知病蛉?
4、什么是協(xié)程? - 為什么使用 Parcelable铺然,好處是什么俗孝?
- Android 圖像顯示相關(guān)流程,Vsync 信號等
4魄健、三方源碼
-
Glide :加載赋铝、緩存、LRU 算法
(如何自己設(shè)計一個大圖加載框架)
(LRUCache 原理) - EventBus
- LeakCanary
- ARouter
重點:Router 原理沽瘦,如何實現(xiàn)組件間的通信革骨,組件化平級調(diào)用數(shù)據(jù)的方式。
- 插件化(不同插件化機制原理與流派析恋,優(yōu)缺點良哲。局限性)
- 熱修復(fù)
-
RXJava
(RxJava 的線程切換原理) -
Retrofit
(Retrofit 在 OkHttp 上做了哪些封裝?動態(tài)代理和靜態(tài)代理的區(qū)別助隧,是怎么實現(xiàn)的) - OkHttp 和 Volley 的區(qū)別筑凫。
1、OkHttp 源碼并村,網(wǎng)絡(luò)緩存
2巍实、如果從網(wǎng)絡(luò)加載一個 10M 的圖片,說下注意事項
3哩牍、安卓為啥要加簽名機制
5蔫浆、算法與數(shù)據(jù)結(jié)構(gòu)
單鏈表:反轉(zhuǎn)、插入姐叁、刪除
雙鏈表:插入、刪除
手寫常見排序洗显、歸并排序外潜、堆排序
二叉樹前序、中序挠唆、后序遍歷
最大 K 問題
廣度处窥、深度優(yōu)先搜索算法
可以去刷一下 LeetCode ,對自己提升也會比較大。
String 轉(zhuǎn) int玄组。
核心算法就三行代碼滔驾,不過臨界條件很多,除了判空俄讹,還需要注意負(fù)數(shù)哆致、Integer 的最大最小值邊界等;如何判斷一個單鏈表有環(huán)患膛?
鏈表翻轉(zhuǎn)摊阀;
快排;
100 億個單詞,找出出現(xiàn)頻率最高的單詞胞此。要求幾種方案臣咖;
鏈表每 k 位逆序;
鏡像二叉樹漱牵;
找出一個無序數(shù)組中出現(xiàn)超過一半次數(shù)的數(shù)字夺蛇;
計算二叉樹的最大深度,要求非遞歸算法酣胀。
String 方式計算加法刁赦。
6、項目 & HR
- 項目開發(fā)中遇到的最大的一個難題和挑戰(zhàn)灵临,你是如何解決的截型。(95% 會問到)
- 說說你開發(fā)最大的優(yōu)勢點(95% 會問到)
- 你為什么會離開上家公司
- 你的缺點是什么?
- 你能給公司帶來什么效益儒溉?
- 你對未來的職業(yè)規(guī)劃宦焦?
下次更新內(nèi)容章節(jié)為 Java 中的集合,我會根據(jù)內(nèi)容多少決定分幾篇文章去講顿涣,大致內(nèi)容如我整理腦圖
為避免失聯(lián)或想第一時間查看我的文章更新波闹,可關(guān)注我的微信公眾號 KevenZheng ,之后會陸續(xù)更新上述目錄的內(nèi)容,敬請關(guān)注涛碑。
如需轉(zhuǎn)載精堕,請聯(lián)系我或注明出處!