中高級面試中,你不得不會的知識點

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

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

更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)
能夠點擊關於我聯繫我獲取完整PDF或者互相交流
(VX:mm14525201314)git

一、Java 相關

  1. 容器(HashMap、HashSet、LinkedList、ArrayList、數組等)
須要瞭解其實現原理,還要靈活運用,如:本身實現 LinkedList、兩個棧實現一個隊列,數組實現棧,隊列實現棧等。

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

  1. 內存模型
  2. 垃圾回收算法(JVM)

JVM 類加載機制、垃圾回收算法對比、Java 虛擬機結構面試

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

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

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

優勢:編程

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

缺點:設計模式

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

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

  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 如何實現拉弓效果,貝瑟爾曲線原理實現?

2. 事件攔截分發

事件分發已經不是直接讓你講了,會給你具體的場景,好比 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 原理)
6丶 圖形圖像相關:OpenGL ES 管線流程、EGL 的認識、Shader 相關
7丶 SurfaceView、TextureView、GLSurfaceView 區別及使用場景
8丶. 動畫、差值器、估值器

屬性動畫、補間動畫、幀動畫的區別和使用場景

9丶 MVC、MVP、MVVM

相互間的區別和各類使用場景,如何選擇適合本身的開發架構。

10丶 Handler、ThreadLocal、AsyncTask、IntentService 原理及應用

Handler 機制原理,IdleHandler 何時調用。

12丶 Gradle(Groovy 語法、Gradle 插件開發基礎)

11丶 熱修復、插件化

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

12丶 Activity 生命週期

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

14丶 講講 Android 的四大組件;

15丶 組件化架構思路

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

16丶 系統打包流程

17丶 Android 有哪些存儲數據的方式。
18丶 SharedPrefrence 源碼和問題點;

19丶 sqlite 相關

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

20丶 ListViewRecyclerView 區別?RecyclerView 有幾層緩存,如何讓兩個 RecyclerView 共用一個緩存?

一、RecycleView 如何進行局部刷新。 二、性能優化。

21丶 如何判斷一個 APP 在前臺仍是後臺?

22丶 如何作應用保活?全家桶原理?

23丶 混合開發

一、 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 原理,如何實現組件間的通訊,組件化平級調用數據的方式。

5. 插件化(不一樣插件化機制原理與流派,優缺點。侷限性)
6. 熱修復
7. RXJava

(RxJava 的線程切換原理)

8. Retrofit

(Retrofit 在 OkHttp 上作了哪些封裝?動態代理和靜態代理的區別,是怎麼實現的)

9. 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. 你對將來的職業規劃?

請查看完整的PDF版
(更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。)
能夠點擊關於我聯繫我獲取完整PDF
(VX:mm14525201314)

image

相關文章
相關標籤/搜索