又到年末了,每到這個時候,咱們都會慢慢反思,這一年都作了什麼?有什麼進步?年初的計劃都實現了嗎?明年年初有跳槽的底氣了嗎?何況今年的互聯網環境太差,須要本身有足夠的知識儲備,纔可以應對這凌冽的寒風。java
本文主要是整理了中高級安卓須要會的(或者說面試被頻繁問到的內容),主要做爲參考大綱,以後會陸續更新每一個詳細部分,供你們參考,互相學習。面試
須要瞭解其實現原理,還要靈活運用,如:本身實現 LinkedList、兩個棧實現一個隊列,數組實現棧,隊列實現棧等。算法
HashMap、HashTable 和 CurrentHashMap 的核心區別(併發),其次內部數據結構的實現、擴容、存取操做,再深一點 哈希碰撞,哈希計算,哈希映射,爲何是頭插法,擴容爲何是 2 的冪次等。sql
參考連接數據庫
JAVA容器-自問自答學HashMap
什麼是HashMap?
從源碼角度認識ArrayList,LinkedList與HashMap編程
參考連接設計模式
理解Java內存模型
你瞭解Java內存模型麼(Java七、八、9內存模型的區別)數組
JVM 類加載機制、垃圾回收算法對比、Java 虛擬機結構
當你講到分代回收算法的時候,難免會被追問到新生對象是怎麼從年輕代到老年代的,以及能夠做爲 root 結點的對象有哪些兩個問題。
複製代碼
一、談談對 JVM 的理解?
二、JVM 內存區域,開線程影響哪塊區域內存?
三、對 Dalvik、ART 虛擬機有什麼瞭解?對比?瀏覽器
ART 的機制與 Dalvik 不一樣。在Dalvik下,應用每次運行的時候,字節碼都須要經過即時編譯器(just in time ,JIT)轉換爲機器碼,這會拖慢應用的運行效率,而在ART 環境中,應用在第一次安裝的時候,字節碼就會預先編譯成機器碼,極大的提升了程序的運行效率,同時減小了手機的耗電量,使其成爲真正的本地應用。這個過程叫作預編譯(AOT,Ahead-Of-Time)。這樣的話,應用的啓動(首次)和執行都會變得更加快速。緩存
優勢:
缺點:
四、垃圾回收機制和調用 System.gc()的區別?
參考連接
線程有哪些狀態,哪些鎖,各類鎖的區別
併發編程:
synchronized 和 volatile 、ReentrantLock 、CAS 的區別
synchronized 修飾實例方法和修飾靜態方法有啥不同。
複製代碼
sleep 、wait、yield 的區別,wait 的線程如何喚醒它
計算機網絡部分:
一、TCP 有哪些狀態
二、三次握手、四次揮手。爲啥不是三次不是兩次
三、HTTPS 和 HTTP 的區別,HTTPS 2.0 3.0?
四、瀏覽器輸入一個 URL 按下回車網絡傳輸的流程?
五、問的深一點的可能涉及到網絡架構,每層有什麼協議,FTP 相關原理,例:TCP 創建鏈接後,發包頻率是怎麼樣的?
複製代碼
一、生產者模式和消費者模式的區別?
二、單例模式雙重加鎖,爲何這樣作?
三、知道的設計模式有哪些?
四、項目中經常使用的設計模式有哪些?
五、手寫生產者、消費者模式。
六、手寫觀察者模式代碼。
七、適配器模式、裝飾者模式、外觀模式的異同?
八、談談對 java 狀態機的理解。
九、談談應用更新(灰度、強制更新、分區更新?)
複製代碼
強引用、軟引用、弱引用、虛引用的區別以及使用場景。
強引用置爲 null,會不會被回收?
稍微問的深一些的面試官會和內存泄漏檢測原理以及垃圾回收糅雜在一塊兒。
複製代碼
問到泛型、泛型擦除、通配符相關的東西
複製代碼
(參考連接:自定義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)啓動優化
冷啓動什麼的確定是基礎,後續應該還有的是懶加載,丟線程池同步處理,須要注意這裏可能會有的坑是,丟線程池如何知道所有完成。
複製代碼
問題:
一、啓動頁白屏及黑屏解決?
二、啓動太慢如何解決?
三、啓動崩潰捕捉?
四、Https 請求慢的解決辦法(DNS、攜帶數據、直接訪問 IP) 5. 緩存本身如何實現(LRUCache 原理) 8. 圖形圖像相關:OpenGL ES 管線流程、EGL 的認識、Shader 相關 9. SurfaceView、TextureView、GLSurfaceView 區別及使用場景 10. 動畫、差值器、估值器(Android中的View動畫和屬性動畫 - 簡書、Android 動畫 介紹與使用)
屬性動畫、補間動畫、幀動畫的區別和使用場景
複製代碼
相互間的區別和各類使用場景,如何選擇適合本身的開發架構。
複製代碼
Handler 機制原理,IdleHandler 何時調用。
複製代碼
Gradle(Groovy 語法、Gradle 插件開發基礎)
熱修復、插件化
(一、談談對 ClassLoader 的理解
二、雙親委託機制的好處
三、自定義 ClassLoader 四、插件化爲何會出現,如何代碼加載,資源加載,代理 Hook)
Activity 生命週期;
Android 的 4 大啓動模式,注意 onNewIntent() 的調用。
講講 Android 的四大組件;
組件化架構思路
一、如何從一個老項目一步步實現組件化,主要問思路,考察架構能力和思考能力。(須要考慮不少,每一步作什麼,順序很重要)
二、組件化和模塊化的理解與區別?
系統打包流程
Android 有哪些存儲數據的方式。
SharedPrefrence 源碼和問題點;
sqlite 相關
一、sqlite 升級,增長字段的語句
二、數據庫框架對比和源碼分析
三、數據庫優化及數據遷移問題
四、getWritableDatabase 和 getReadableDatabase 的區別
ListView 和 RecyclerView 區別?RecyclerView 有幾層緩存,如何讓兩個 RecyclerView 共用一個緩存?
一、RecycleView 如何進行局部刷新。 二、性能優化。
如何判斷一個 APP 在前臺仍是後臺?
如何作應用保活?全家桶原理?
混合開發
一、 Hybrid 作過嗎? 例:Android 經過WebView調用 JS 代碼 例:JS 經過WebView調用 Android 代碼;
二、Hybrid 通訊原理是什麼,有作研究嗎?
三、說說你用過的混合開發技術有哪些?各有什麼優缺點?
重點:Router 原理,如何實現組件間的通訊,組件化平級調用數據的方式。
複製代碼
單鏈表:反轉、插入、刪除
雙鏈表:插入、刪除
手寫常見排序、歸併排序、堆排序
二叉樹前序、中序、後序遍歷
最大 K 問題
廣度、深度優先搜索算法
能夠去刷一下 LeetCode ,對本身提高也會比較大。
String 轉 int。 核心算法就三行代碼,不過臨界條件不少,除了判空,還須要注意負數、Integer 的最大最小值邊界等;
如何判斷一個單鏈表有環?
鏈表翻轉;
快排;
100 億個單詞,找出出現頻率最高的單詞。要求幾種方案;
鏈表每 k 位逆序;
鏡像二叉樹;
找出一個無序數組中出現超過一半次數的數字;
計算二叉樹的最大深度,要求非遞歸算法。
String 方式計算加法。
下次更新內容章節爲 Java 中的集合,我會根據內容多少決定分幾篇文章去講,大體內容如我整理腦圖
爲避免失聯或想第一時間查看個人文章更新,可關注個人微信公衆號 KevenZheng ,以後會陸續更新上述目錄的內容,敬請關注。
如需轉載,請聯繫我或註明出處!