Android 中高級面試必知必會

又到年末了,每到這個時候,咱們都會慢慢反思,這一年都作了什麼?有什麼進步?年初的計劃都實現了嗎?明年年初有跳槽的底氣了嗎?何況今年的互聯網環境太差,須要本身有足夠的知識儲備,纔可以應對這凌冽的寒風。java

本文主要是整理了中高級安卓須要會的(或者說面試被頻繁問到的內容),主要做爲參考大綱,以後會陸續更新每一個詳細部分,供你們參考,互相學習。面試

一、Java 相關

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

須要瞭解其實現原理,還要靈活運用,如:本身實現 LinkedList、兩個棧實現一個隊列,數組實現棧,隊列實現棧等。算法

HashMap、HashTable 和 CurrentHashMap 的核心區別(併發),其次內部數據結構的實現、擴容、存取操做,再深一點 哈希碰撞,哈希計算,哈希映射,爲何是頭插法,擴容爲何是 2 的冪次等。sql

參考連接數據庫

JAVA容器-自問自答學HashMap
什麼是HashMap?
從源碼角度認識ArrayList,LinkedList與HashMap編程

  1. 內存模型

參考連接設計模式

理解Java內存模型
你瞭解Java內存模型麼(Java七、八、9內存模型的區別)數組

  1. 垃圾回收算法(JVM)
JVM 類加載機制、垃圾回收算法對比、Java 虛擬機結構

當你講到分代回收算法的時候,難免會被追問到新生對象是怎麼從年輕代到老年代的,以及能夠做爲 root 結點的對象有哪些兩個問題。
複製代碼

一、談談對 JVM 的理解?
二、JVM 內存區域,開線程影響哪塊區域內存?
三、對 Dalvik、ART 虛擬機有什麼瞭解?對比?瀏覽器

ART 的機制與 Dalvik 不一樣。在Dalvik下,應用每次運行的時候,字節碼都須要經過即時編譯器(just in time ,JIT)轉換爲機器碼,這會拖慢應用的運行效率,而在ART 環境中,應用在第一次安裝的時候,字節碼就會預先編譯成機器碼,極大的提升了程序的運行效率,同時減小了手機的耗電量,使其成爲真正的本地應用。這個過程叫作預編譯(AOT,Ahead-Of-Time)。這樣的話,應用的啓動(首次)和執行都會變得更加快速。緩存

優勢:

  • 系統性能的顯著提高。
  • 應用啓動更快、運行更快、體驗更流暢、觸感反饋更及時。
  • 更長的電池續航能力。
  • 支持更低的硬件。

缺點:

  • 機器碼佔用的存儲空間更大,字節碼變爲機器碼以後,可能會增長10%-20%(不過在應用包中,可執行的代碼經常只是一部分。好比最新的 Google+ APK 是 28.3 MB,可是代碼只有 6.9 MB。)
  • 應用的安裝時間會變長。

四、垃圾回收機制和調用 System.gc()的區別?

參考連接

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

  1. 類加載過程(須要多看看,重在理解,對於熱修復和插件化比較重要)
  2. 反射
  3. 多線程和線程池
線程有哪些狀態,哪些鎖,各類鎖的區別

併發編程:
synchronized 和 volatile 、ReentrantLock 、CAS 的區別

synchronized 修飾實例方法和修飾靜態方法有啥不同。
複製代碼

sleep 、wait、yield 的區別,wait 的線程如何喚醒它

  1. HTTP、HTTPS、TCP/IP、Socket通訊、三次握手四次揮手過程
計算機網絡部分:
一、TCP 有哪些狀態
二、三次握手、四次揮手。爲啥不是三次不是兩次
三、HTTPS 和 HTTP 的區別,HTTPS 2.0 3.0?
四、瀏覽器輸入一個 URL 按下回車網絡傳輸的流程?
五、問的深一點的可能涉及到網絡架構,每層有什麼協議,FTP 相關原理,例:TCP 創建鏈接後,發包頻率是怎麼樣的?

複製代碼
  1. 設計模式(六大基本原則、項目中經常使用的設計模式、手寫單例等)
一、生產者模式和消費者模式的區別?
二、單例模式雙重加鎖,爲何這樣作?
三、知道的設計模式有哪些?
四、項目中經常使用的設計模式有哪些?
五、手寫生產者、消費者模式。
六、手寫觀察者模式代碼。
七、適配器模式、裝飾者模式、外觀模式的異同?
八、談談對 java 狀態機的理解。
九、談談應用更新(灰度、強制更新、分區更新?)
複製代碼
  1. 斷點續傳
  2. Java 四大引用
強引用、軟引用、弱引用、虛引用的區別以及使用場景。

強引用置爲 null,會不會被回收?

稍微問的深一些的面試官會和內存泄漏檢測原理以及垃圾回收糅雜在一塊兒。

複製代碼
  1. Java 的泛型,<? super T> 和 <? extends T> 的區別
問到泛型、泛型擦除、通配符相關的東西
複製代碼
  1. final、finally、finalize 的區別
  2. 接口、抽象類的區別

二、Android 相關

  1. 自定義 View
    一、ViewGroup 繪製順序 (例:自定義 ViewGroup 如何實現 FlowLayout?如何實現 FlowLayout 調換順序)
    二、 自定義 View 如何實現打桌球效果;
    三、 自定義 View 如何實現拉弓效果,貝瑟爾曲線原理實現?

(參考連接:自定義View,有這一篇就夠了 - 簡書Android 自定義 View) 2. 事件攔截分發(Android事件分發機制,大表哥帶你慢慢深刻 - 簡書 )

事件分發已經不是直接讓你講了,會給你具體的場景,好比 A 嵌套 B ,B 嵌套 C,從 C 中心按下,一下滑出到 A,事件分發的過程,這裏面確定會有 ACTION_CANCEL 的相關調用時機。
複製代碼
  1. 解決過的一些性能問題,在項目中的實際運用。

  2. 性能優化工具
    (TraceView、Systrace、調試 GPU 過分繪製 & GPU 呈現模式分析、Hierarchy Viewer、MAT、Memory Monitor & Heap Viewer & Allocation Tracker 等)

  3. 性能優化 (講講你本身項目中作過的性能優化) (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)啓動優化

冷啓動什麼的確定是基礎,後續應該還有的是懶加載,丟線程池同步處理,須要注意這裏可能會有的坑是,丟線程池如何知道所有完成。
複製代碼

問題
一、啓動頁白屏及黑屏解決?
二、啓動太慢如何解決?
三、啓動崩潰捕捉?
四、Https 請求慢的解決辦法(DNS、攜帶數據、直接訪問 IP) 5. 緩存本身如何實現(LRUCache 原理) 8. 圖形圖像相關:OpenGL ES 管線流程、EGL 的認識、Shader 相關 9. SurfaceView、TextureView、GLSurfaceView 區別及使用場景 10. 動畫、差值器、估值器Android中的View動畫和屬性動畫 - 簡書Android 動畫 介紹與使用

屬性動畫、補間動畫、幀動畫的區別和使用場景
複製代碼
  1. MVC、MVP、MVVM
相互間的區別和各類使用場景,如何選擇適合本身的開發架構。
複製代碼
  1. Handler、ThreadLocal、AsyncTask、IntentService 原理及應用
Handler 機制原理,IdleHandler 何時調用。
複製代碼
  1. Gradle(Groovy 語法、Gradle 插件開發基礎)

  2. 熱修復、插件化
    (一、談談對 ClassLoader 的理解
    二、雙親委託機制的好處
    三、自定義 ClassLoader 四、插件化爲何會出現,如何代碼加載,資源加載,代理 Hook)

  3. Activity 生命週期

  4. Android 的 4 大啓動模式,注意 onNewIntent() 的調用。

  5. 講講 Android 的四大組件;

  6. 組件化架構思路
    一、如何從一個老項目一步步實現組件化,主要問思路,考察架構能力和思考能力。(須要考慮不少,每一步作什麼,順序很重要)
    二、組件化和模塊化的理解與區別?

  7. 系統打包流程

  8. Android 有哪些存儲數據的方式。

  9. SharedPrefrence 源碼和問題點;

  10. sqlite 相關
    一、sqlite 升級,增長字段的語句
    二、數據庫框架對比和源碼分析
    三、數據庫優化及數據遷移問題
    四、getWritableDatabase 和 getReadableDatabase 的區別

  11. ListViewRecyclerView 區別?RecyclerView 有幾層緩存,如何讓兩個 RecyclerView 共用一個緩存?
    一、RecycleView 如何進行局部刷新。 二、性能優化。

  12. 如何判斷一個 APP 在前臺仍是後臺?

  13. 如何作應用保活?全家桶原理?

  14. 混合開發
    一、 Hybrid 作過嗎? :Android 經過WebView調用 JS 代碼 :JS 經過WebView調用 Android 代碼;
    二、Hybrid 通訊原理是什麼,有作研究嗎?
    三、說說你用過的混合開發技術有哪些?各有什麼優缺點?

三、Android Framework

  1. AMS 、PMS
  2. Activity 啓動流程,App 啓動流程
  3. Binder 機制(IPC、AIDL 的使用)
    (講講 Linux 上的 IPC 通訊,Binder 有什麼優點,Android 上有哪些多進程通訊機制?)
    一、項目中碰見了什麼多進程場景?
    二、AIDL 是什麼?解決了什麼問題?
    三、談談對進程共享和線程安全的認知?
    四、什麼是協程?
  4. 爲何使用 Parcelable,好處是什麼?
  5. Android 圖像顯示相關流程,Vsync 信號等

四、三方源碼

  1. Glide :加載、緩存、LRU 算法
    (如何本身設計一個大圖加載框架)
    (LRUCache 原理)
  2. EventBus
  3. LeakCanary
  4. ARouter
重點:Router 原理,如何實現組件間的通訊,組件化平級調用數據的方式。
複製代碼
  1. 插件化(不一樣插件化機制原理與流派,優缺點。侷限性)
  2. 熱修復
  3. RXJava
    (RxJava 的線程切換原理)
  4. Retrofit
    (Retrofit 在 OkHttp 上作了哪些封裝?動態代理和靜態代理的區別,是怎麼實現的)
  5. OkHttp 和 Volley 的區別。
    一、OkHttp 源碼,網絡緩存
    二、若是從網絡加載一個 10M 的圖片,說下注意事項
    三、安卓爲啥要加簽名機制

五、算法與數據結構

  1. 單鏈表:反轉、插入、刪除

  2. 雙鏈表:插入、刪除

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

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

  5. 最大 K 問題

  6. 廣度、深度優先搜索算法

  7. 能夠去刷一下 LeetCode ,對本身提高也會比較大。

  8. String 轉 int。 核心算法就三行代碼,不過臨界條件不少,除了判空,還須要注意負數、Integer 的最大最小值邊界等;

  9. 如何判斷一個單鏈表有環?

  10. 鏈表翻轉;

  11. 快排;

  12. 100 億個單詞,找出出現頻率最高的單詞。要求幾種方案;

  13. 鏈表每 k 位逆序;

  14. 鏡像二叉樹;

  15. 找出一個無序數組中出現超過一半次數的數字;

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

  17. String 方式計算加法。

六、項目 & HR

  1. 項目開發中遇到的最大的一個難題和挑戰,你是如何解決的。(95% 會問到)
  2. 說說你開發最大的優點點(95% 會問到)
  3. 你爲何會離開上家公司
  4. 你的缺點是什麼?
  5. 你能給公司帶來什麼效益?
  6. 你對將來的職業規劃?

下次更新內容章節爲 Java 中的集合,我會根據內容多少決定分幾篇文章去講,大體內容如我整理腦圖

爲避免失聯或想第一時間查看個人文章更新,可關注個人微信公衆號 KevenZheng ,以後會陸續更新上述目錄的內容,敬請關注。

如需轉載,請聯繫我或註明出處!

相關文章
相關標籤/搜索