又到年底了,每到這個時候,我們都會慢慢反思,這一年都做了什麼?有什麼進步?年初的計劃都實現了嗎?明年年初有跳槽的底氣了嗎?況且今年的網際網路環境太差,需要自己有足夠的知識儲備,才能夠應對這凌冽的寒風。
本文主要是整理了中高階安卓需要會的(或者說面試被頻繁問到的內容),主要作為參考大綱,之後會陸續更新每個詳細部分,供大家參考,互相學習。
1、Java 相關
- 容器(HashMap、HashSet、LinkedList、ArrayList、陣列等)
需要了解其實現原理,還要靈活運用,如:自己實現 LinkedList、兩個棧實現一個佇列,陣列實現棧,佇列實現棧等。
HashMap、HashTable 和 CurrentHashMap 的核心區別(併發),其次內部資料結構的實現、擴容、存取操作,再深一點 雜湊碰撞,雜湊計算,雜湊對映,為什麼是頭插法,擴容為什麼是 2 的冪次等。
參考連結
JAVA容器-自問自答學HashMap
什麼是HashMap?
從原始碼角度認識ArrayList,LinkedList與HashMap
- 記憶體模型
參考連結
理解Java記憶體模型
你瞭解Java記憶體模型麼(Java7、8、9記憶體模型的區別)
- 垃圾回收演算法(JVM)
JVM 類載入機制、垃圾回收演算法對比、Java 虛擬機器結構
當你講到分代回收演算法的時候,不免會被追問到新生物件是怎麼從年輕代到老年代的,以及可以作為 root 結點的物件有哪些兩個問題。
複製程式碼
1、談談對 JVM 的理解?
2、JVM 記憶體區域,開執行緒影響哪塊區域記憶體?
3、對 Dalvik、ART 虛擬機器有什麼瞭解?對比?
ART 的機制與 Dalvik 不同。在Dalvik下,應用每次執行的時候,位元組碼都需要通過即時編譯器(just in time ,JIT)轉換為機器碼,這會拖慢應用的執行效率,而在ART 環境中,應用在第一次安裝的時候,位元組碼就會預先編譯成機器碼,極大的提高了程式的執行效率,同時減少了手機的耗電量,使其成為真正的本地應用。這個過程叫做預編譯(AOT,Ahead-Of-Time)。這樣的話,應用的啟動(首次)和執行都會變得更加快速。
優點:
- 系統效能的顯著提升。
- 應用啟動更快、執行更快、體驗更流暢、觸感反饋更及時。
- 更長的電池續航能力。
- 支援更低的硬體。
缺點:
- 機器碼佔用的儲存空間更大,位元組碼變為機器碼之後,可能會增加10%-20%(不過在應用包中,可執行的程式碼常常只是一部分。比如最新的 Google+ APK 是 28.3 MB,但是程式碼只有 6.9 MB。)
- 應用的安裝時間會變長。
4、垃圾回收機制和呼叫 System.gc()的區別?
參考連結
- 類載入過程(需要多看看,重在理解,對於熱修復和外掛化比較重要)
- 反射
- 多執行緒和執行緒池
執行緒有哪些狀態,哪些鎖,各種鎖的區別
併發程式設計:
synchronized 和 volatile 、ReentrantLock 、CAS 的區別
synchronized 修飾例項方法和修飾靜態方法有啥不一樣。
複製程式碼
sleep 、wait、yield 的區別,wait 的執行緒如何喚醒它
- HTTP、HTTPS、TCP/IP、Socket通訊、三次握手四次揮手過程
計算機網路部分:
1、TCP 有哪些狀態
2、三次握手、四次揮手。為啥不是三次不是兩次
3、HTTPS 和 HTTP 的區別,HTTPS 2.0 3.0?
4、瀏覽器輸入一個 URL 按下回車網路傳輸的流程?
5、問的深一點的可能涉及到網路架構,每層有什麼協議,FTP 相關原理,例:TCP 建立連線後,發包頻率是怎麼樣的?
複製程式碼
- 設計模式(六大基本原則、專案中常用的設計模式、手寫單例等)
1、生產者模式和消費者模式的區別?
2、單例模式雙重加鎖,為什麼這樣做?
3、知道的設計模式有哪些?
4、專案中常用的設計模式有哪些?
5、手寫生產者、消費者模式。
6、手寫觀察者模式程式碼。
7、介面卡模式、裝飾者模式、外觀模式的異同?
8、談談對 java 狀態機的理解。
9、談談應用更新(灰度、強制更新、分割槽更新?)
複製程式碼
- 斷點續傳
- Java 四大引用
強引用、軟引用、弱引用、虛引用的區別以及使用場景。
強引用置為 null,會不會被回收?
稍微問的深一些的面試官會和記憶體洩漏檢測原理以及垃圾回收糅雜在一起。
複製程式碼
- Java 的泛型,<? super T> 和 <? extends T> 的區別
問到泛型、泛型擦除、萬用字元相關的東西
複製程式碼
- final、finally、finalize 的區別
- 介面、抽象類的區別
2、Android 相關
- 自定義 View
1、ViewGroup 繪製順序 (例:自定義 ViewGroup 如何實現 FlowLayout?如何實現 FlowLayout 調換順序)
2、 自定義 View 如何實現打桌球效果;
3、 自定義 View 如何實現拉弓效果,貝瑟爾曲線原理實現?
(參考連結:自定義View,有這一篇就夠了 - 簡書、Android 自定義 View) 2. 事件攔截分發(Android事件分發機制,大表哥帶你慢慢深入 - 簡書 )
事件分發已經不是直接讓你講了,會給你具體的場景,比如 A 巢狀 B ,B 巢狀 C,從 C 中心按下,一下滑出到 A,事件分發的過程,這裡面肯定會有 ACTION_CANCEL 的相關呼叫時機。
複製程式碼
-
解決過的一些效能問題,在專案中的實際運用。
-
效能優化工具
(TraceView、Systrace、除錯 GPU 過度繪製 & GPU 呈現模式分析、Hierarchy Viewer、MAT、Memory Monitor & Heap Viewer & Allocation Tracker 等) -
效能優化 (講講你自己專案中做過的效能優化) (1)網路:API 優化、流量優化、弱網優化
(2)記憶體:OOM 處理、記憶體洩漏、記憶體檢測、分析、Bitmap 優化
LeakCanary 原理,為什麼檢測記憶體洩漏需要兩次? (3)繪製
(4)電量:WeakLock 機制、JobScheduler 機制
(5)APK 瘦身
(APK 瘦身是怎麼做的,只用 armabi-v7a 沒有什麼問題麼? APK 瘦身這個基本是 100% 被面試問到,可能是我簡歷上提到的原因。)
(6)記憶體抖動
(7)記憶體洩漏
(8)卡頓 {如何檢測卡頓,卡頓原理是什麼,怎麼判斷頁面響應卡頓還是邏輯處理造成的卡頓}
BlockCanary 的原理
(9)效能優化:佈局優化、過度渲染處理、ANR 處理、監控、埋點、Crash 上傳。
(10)啟動優化
冷啟動什麼的肯定是基礎,後續應該還有的是懶載入,丟執行緒池同步處理,需要注意這裡可能會有的坑是,丟執行緒池如何知道全部完成。
複製程式碼
問題:
1、啟動頁白屏及黑屏解決?
2、啟動太慢如何解決?
3、啟動崩潰捕捉?
4、Https 請求慢的解決辦法(DNS、攜帶資料、直接訪問 IP)
5. 快取自己如何實現(LRUCache 原理)
8. 圖形影像相關:OpenGL ES 管線流程、EGL 的認識、Shader 相關
9. SurfaceView、TextureView、GLSurfaceView 區別及使用場景
10. 動畫、差值器、估值器(Android中的View動畫和屬性動畫 - 簡書、Android 動畫 介紹與使用)
屬性動畫、補間動畫、幀動畫的區別和使用場景
複製程式碼
- MVC、MVP、MVVM
相互間的區別和各種使用場景,如何選擇適合自己的開發架構。
複製程式碼
- Handler、ThreadLocal、AsyncTask、IntentService 原理及應用
Handler 機制原理,IdleHandler 什麼時候呼叫。
複製程式碼
-
Gradle(Groovy 語法、Gradle 外掛開發基礎)
-
熱修復、外掛化
(1、談談對 ClassLoader 的理解
2、雙親委託機制的好處
3、自定義 ClassLoader 4、外掛化為什麼會出現,如何程式碼載入,資源載入,代理 Hook) -
Activity 生命週期;
-
Android 的 4 大啟動模式,注意 onNewIntent() 的呼叫。
-
講講 Android 的四大元件;
-
元件化架構思路
1、如何從一個老專案一步步實現元件化,主要問思路,考察架構能力和思考能力。(需要考慮很多,每一步做什麼,順序很重要)
2、元件化和模組化的理解與區別? -
系統打包流程
-
Android 有哪些儲存資料的方式。
-
SharedPrefrence 原始碼和問題點;
-
sqlite 相關
1、sqlite 升級,增加欄位的語句
2、資料庫框架對比和原始碼分析
3、資料庫優化及資料遷移問題
4、getWritableDatabase 和 getReadableDatabase 的區別 -
ListView 和 RecyclerView 區別?RecyclerView 有幾層快取,如何讓兩個 RecyclerView 共用一個快取?
1、RecycleView 如何進行區域性重新整理。 2、效能優化。 -
如何判斷一個 APP 在前臺還是後臺?
-
如何做應用保活?全家桶原理?
-
混合開發
1、 Hybrid 做過嗎? 例:Android 通過WebView呼叫 JS 程式碼 例:JS 通過WebView呼叫 Android 程式碼;
2、Hybrid 通訊原理是什麼,有做研究嗎?
3、說說你用過的混合開發技術有哪些?各有什麼優缺點?
3、Android Framework
- AMS 、PMS
- Activity 啟動流程,App 啟動流程
- Binder 機制(IPC、AIDL 的使用)
(講講 Linux 上的 IPC 通訊,Binder 有什麼優勢,Android 上有哪些多程式通訊機制?)
1、專案中遇見了什麼多程式場景?
2、AIDL 是什麼?解決了什麼問題?
3、談談對程式共享和執行緒安全的認知?
4、什麼是協程? - 為什麼使用 Parcelable,好處是什麼?
- Android 影像顯示相關流程,Vsync 訊號等
4、三方原始碼
- Glide :載入、快取、LRU 演算法
(如何自己設計一個大圖載入框架)
(LRUCache 原理) - EventBus
- LeakCanary
- ARouter
重點:Router 原理,如何實現元件間的通訊,元件化平級呼叫資料的方式。
複製程式碼
- 外掛化(不同外掛化機制原理與流派,優缺點。侷限性)
- 熱修復
- RXJava
(RxJava 的執行緒切換原理) - Retrofit
(Retrofit 在 OkHttp 上做了哪些封裝?動態代理和靜態代理的區別,是怎麼實現的) - OkHttp 和 Volley 的區別。
1、OkHttp 原始碼,網路快取
2、如果從網路載入一個 10M 的圖片,說下注意事項
3、安卓為啥要加簽名機制
5、演算法與資料結構
-
單連結串列:反轉、插入、刪除
-
雙連結串列:插入、刪除
-
手寫常見排序、歸併排序、堆排序
-
二叉樹前序、中序、後序遍歷
-
最大 K 問題
-
廣度、深度優先搜尋演算法
-
可以去刷一下 LeetCode ,對自己提升也會比較大。
-
String 轉 int。 核心演算法就三行程式碼,不過臨界條件很多,除了判空,還需要注意負數、Integer 的最大最小值邊界等;
-
如何判斷一個單連結串列有環?
-
連結串列翻轉;
-
快排;
-
100 億個單詞,找出出現頻率最高的單詞。要求幾種方案;
-
連結串列每 k 位逆序;
-
映象二叉樹;
-
找出一個無序陣列中出現超過一半次數的數字;
-
計算二叉樹的最大深度,要求非遞迴演算法。
-
String 方式計算加法。
6、專案 & HR
- 專案開發中遇到的最大的一個難題和挑戰,你是如何解決的。(95% 會問到)
- 說說你開發最大的優勢點(95% 會問到)
- 你為什麼會離開上家公司
- 你的缺點是什麼?
- 你能給公司帶來什麼效益?
- 你對未來的職業規劃?
下次更新內容章節為 Java 中的集合,我會根據內容多少決定分幾篇文章去講,大致內容如我整理腦圖
為避免失聯或想第一時間檢視我的文章更新,可關注我的微信公眾號 KevenZheng ,之後會陸續更新上述目錄的內容,敬請關注。
如需轉載,請聯絡我或註明出處!