在博主認爲,對於Android面試以及進階的最佳學習方法莫過於刷題+博客+書籍+總結,前三者博主將淋漓盡致地揮毫於這篇博客文章中,至於總結在於個人,實際上越到後面你會發現面試並不難,其次就是在刷題的過程中有沒有去思考,刷題只是次之,這又是一個層次了,這裏暫時不提後面再談。
博主總結了一系列大廠面試中常問的面試技術點,深入解析以及答案,將爲最近準備面試的各開發者去大廠保駕護航,
何謂面試? 博主所理解的面試,它是一個過程,是不斷沉澱、不斷總結、善於傳達自己的專業領域技術以及解決問題能力的過程。以下是博主總結的一些面試題,文中如有錯誤,懇請批評指正!
Java相關
-
容器(HashMap、HashSet、LinkedList、ArrayList、數組等)
-
內存模型
-
垃圾回收算法(JVM)
-
垃圾回收機制和調用 System.gc()的區別?
-
類加載過程(需要多看看,重在理解,對於熱修復和插件化比較重要)
-
反射
-
多線程和線程池
-
設計模式(六大基本原則、項目中常用的設計模式、手寫單例等)
-
Java 四大引用
-
Java 的泛型
-
final、finally、finalize 的區別
-
接口、抽象類的區別
Android 相關
-
自定義 View
-
事件攔截分發
-
解決過的一些性能問題,在項目中的實際運用
-
性能優化工具
-
性能優化 (講講你自己項目中做過的性能優化)
-
Http[s]請求慢的解決辦法(DNS、攜帶數據、直接訪問 IP)
-
緩存自己如何實現(LRUCache 原理)
-
圖形圖像相關:OpenGL ES 管線流程、EGL 的認識、Shader 相關
-
SurfaceView、TextureView、GLSurfaceView 區別及使用場景
-
動畫、差值器、估值器(Android中的View動畫和屬性動畫 - 簡書、Android 動畫 介紹與使用)
-
MVC、MVP、MVVM
-
Handler、ThreadLocal、AsyncTask、IntentService 原理及應用
-
Gradle(Groovy 語法、Gradle 插件開發基礎)
-
熱修復、插件化
-
組件化架構思路
-
系統打包流程
-
Android 有哪些存儲數據的方式。
-
SharedPrefrence 源碼和問題點;
-
sqlite 相關
-
如何判斷一個 APP 在前臺還是後臺?
-
AMS 、PMS
-
Activity 啓動流程,App 啓動流程
-
Binder 機制(IPC、AIDL 的使用)
-
爲什麼使用 Parcelable,好處是什麼?
-
Android 圖像顯示相關流程,Vsync 信號等
算法與數據結構
-
時間複雜度 / 空間複雜度
-
常用的排序算法有哪些?
-
字符串反轉
-
鏈表反轉(頭插法)
-
如何查找第一個只出現一次的字符(Hash查找)
-
如何查找兩個子視圖的共同父視圖?
-
無序數組中的中位數(快排思想)
-
如何給定一個整數數組和一個目標值,找出數組中和爲目標值的兩個數。
-
二叉樹前序、中序、後序遍歷
-
最大 K 問題
-
廣度、深度優先搜索算法
-
String 轉 int。核心算法就三行代碼,不過臨界條件很多,除了判空,還需要注意負數、Integer 的最大最小值邊界等;
-
如何判斷一個單鏈表有環?
-
100 億個單詞,找出出現頻率最高的單詞。要求幾種方案;
-
鏈表每 k 位逆序;
-
鏡像二叉樹;
-
找出一個無序數組中出現超過一半次數的數字;
-
計算二叉樹的最大深度,要求非遞歸算法。
-
String 方式計算加法。
網絡
1、網絡框架對比和源碼分析
2、網絡七層協議有哪些?
OSI七層模型
- 1、應用層:直接與用戶之間交互的,包括用戶的軟件,網站等
- 2、表示層:使用這個軟件或者網站可以看到的數據:圖片文字等
- 3、會話層:保存登陸連接狀態,在電腦中以cookie保存
- ---------------------------------------------------------------------
- 有的分類方式也會將上面三層分爲一層,統一稱爲應用層
- ---------------------------------------------------------------------
- 4、傳輸層:選擇協議TCP/UDP,相當於給數據加上報頭;[TCP][數據]
- 5、網絡層:通過IP路徑尋址,同時又對數據進行封裝;[IP][[TCP][數據]]
- 6、數據鏈傳輸層;使用Mac地址尋址,又進行了數據封裝;【mac地址】【[IP][[TCP][數據]]】
- 7、物理層;將上面得到的數據轉化爲電信號或者光信號
- ------------------------------------------------------------------------
- 這四層都有socket模塊幫助我們輔助完成
1、Http 和 Https 的區別?Https爲什麼更加安全?
Https特點:基於HTTP協議,通過SSL或TLS提供加密處理數據、驗證對方身份以及數據完整性保護
2、HTTPS的連接建立流程
- client向server發送請求https://baidu.com,然後連接到server的443端口,發送的信息主要是隨機值1和客戶端支持的加密算法。
- server接收到信息之後給予client響應握手信息,包括隨機值2和匹配好的協商加密算法,這個加密算法一定是client發送給server加密算法的子集。
- 隨即server給client發送第二個響應報文是數字證書。服務端必須要有一套數字證書,可以自己製作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,纔可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面,這套證書其實就是一對公鑰和私鑰。傳送證書,這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發機構,過期時間、服務端的公鑰,第三方證書認證機構(CA)的簽名,服務端的域名信息等內容。
- 客戶端解析證書,這部分工作是由客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成一個隨即值(預主祕鑰)。
- 客戶端認證證書通過之後,接下來是通過隨機值1、隨機值2和預主祕鑰組裝會話祕鑰。然後通過證書的公鑰加密會話祕鑰。
- 傳送加密信息,這部分傳送的是用證書加密後的會話祕鑰,目的就是讓服務端使用祕鑰解密得到隨機值1、隨機值2和預主祕鑰。
- 服務端解密得到隨機值1、隨機值2和預主祕鑰,然後組裝會話祕鑰,跟客戶端會話祕鑰相同。
- 客戶端通過會話祕鑰加密一條消息發送給服務端,主要驗證服務端是否正常接受客戶端加密的消息。
- 同樣服務端也會通過會話祕鑰加密一條消息回傳給客戶端,如果客戶端能夠正常接受的話表明SSL層連接建立完成了。
3、解釋一下 三次握手 和 四次揮手
socket底層實現原理 (TCP三次握手四次揮手)
三次握手,是指建立一個TCP連接時,需要客戶端和服務器總共發送3個包。三次握手的目的是連接服務器指定端口,建立TCP連接,並同步連接雙方的序列號和確認號並交換TCP窗口大小信息。
SYN(synchronous)是同步標誌;ACK (Acknowledgement)是確認標誌,seq是序列號
- 第一次握手:客戶端發送一個TCP的SYN標誌位置1的包,指明客戶打算連接的服務器的端口,以及初始序號X,保存在包頭的序列號字段裏。
- 第二次握手:服務器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均爲1同時,將確認序號設置爲客戶的序列號加1以,即X+1。
- 第三次握手:客戶端再次發送確認包(ACK) SYN標誌位爲0,ACK標誌位爲1。並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫序列號的+1。
四次揮手(Four-Way Wavehand)即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開
- (1)第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
- (2)第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。
- (3)第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK態。
- (4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手。
4、TCP 和 UDP的區別
socket底層實現原理 (TCP/UDP)
UDP是面向無連接、傳輸不可靠、用於傳輸少量數據(數據包模式)、速度快的傳輸層協議。注意,UDP傳輸的是數據報包,而TCP是流
5、Cookie和Session
-
Session 是保存在服務端,用於標識用戶
-
Cookie 是保存在客戶端的,瀏覽器端
-
Cookie使用HTTP Header 傳遞數據
Cookie機制定義了兩種Header :Set-Cookie Header 和Cookie Header:Set-Cookie Header 包含於Web服務器的響應頭(Response Header)中;Cookie Header 包含在瀏覽器客戶端請求頭(Reguest Header)中
-
絕大部分情況都是用 Cookie 來實現Session跟蹤的 ,在 Cookie 裏面記錄了一個Session ID
-
Session ID 是一種機制,不同的環境有不同的叫法 比如: java web 是 JSESSIONID
-
okhttp等使用:
classicApplication.getHeadersMap().put("Cookie","SESSION="+sessionId);//01866fbe-725c-482b-aca1-dcd32a6dcfe2 // .addInterceptor(httpCookiesInterceptor)
6、DNS是什麼?
DNS的全稱是Domain Name System。它負責把FQDN(就是以"."分隔結尾的名字)翻譯成一個IP。
最初的DNS系統使用的是一個巨大的hosts.txt文件,最終發展到了現在的分佈式數據庫。DNS系統是一個分佈式的數據庫,當一個數據庫發現自己並沒有某查詢所需要的數據的時候,它將把查詢轉發出去,而轉發的目的地通常是根服務器,根服 務器從上至下層層轉發查詢,直到找到目標爲止。DNS還有一個特點就是使用高速緩存,DNS把查詢過的數據緩存在某處,以便於下次查詢時使用。
DNS報文定義了一個既可以查詢也可以響應的報文格式:
- 最前面的16個bit唯一的標示了問題號碼,用於查詢端區別自己的查詢。
- 緊接着的16個bit又可以做進一步的細分,標示了報文的性質和一些細節,比如說是查詢報文還是響應報文,需要遞歸查詢與否(一般服務器都支持遞歸查詢,而且不需要任何設置,BIND就是這樣)
- 查詢問題後面有查詢類型,包括A,NS,CNAME,PTR,HINFO,MX,如果熟悉BIND的話,就知道在zong的配置文件裏面,每一條記錄都記載了各自的類型,比如A就是IP地址,NS就是名字服務器。
- 響應報文可以回覆多個IP,也就是說,域名可以和多個IP地址對應,並且有很多CNAME。
7、DNS解析過程
8、HTTPS實現原理:SSL建立鏈接過程
- client向server發送請求https://baidu.com,然後連接到server的443端口,發送的信息主要是隨機值1和客戶端支持的加密算法。
- server接收到信息之後給予client響應握手信息,包括隨機值2和匹配好的協商加密算法,這個加密算法一定是client發送給server加密算法的子集。
- 隨即server給client發送第二個響應報文是數字證書。服務端必須要有一套數字證書,可以自己製作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,纔可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面,這套證書其實就是一對公鑰和私鑰。傳送證書,這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發機構,過期時間、服務端的公鑰,第三方證書認證機構(CA)的簽名,服務端的域名信息等內容。
- 客戶端解析證書,這部分工作是由客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成一個隨即值(預主祕鑰)。
- 客戶端認證證書通過之後,接下來是通過隨機值1、隨機值2和預主祕鑰組裝會話祕鑰(這個會話密鑰屬於對稱加密)。然後通過證書的公鑰加密會話祕鑰。
- 傳送加密信息,這部分傳送的是用證書加密後的會話祕鑰,目的就是讓服務端使用祕鑰解密得到隨機值1、隨機值2和預主祕鑰。
- 服務端解密得到隨機值1、隨機值2和預主祕鑰,然後組裝會話祕鑰,跟客戶端會話祕鑰相同。
- 客戶端通過會話祕鑰加密一條消息發送給服務端,主要驗證服務端是否正常接受客戶端加密的消息。
- 同樣服務端也會通過會話祕鑰加密一條消息回傳給客戶端,如果客戶端能夠正常接受的話表明SSL層連接建立完成了。
10.HTTP報文結構
Http協議由什麼組成
請求報文包括三部分:
- (1).請求行:包含請求方法,URI,HTTP版本協議
- (2).請求首部字段
- (3).請求內容實體
響應報文包含三部分:
- (1).狀態行:包含HTTP版本,狀態碼,狀態碼原因短語
- (2).響應首部字段
- (3).響應內容實體
11.HTTP與HTTPS的區別以及如何實現安全性
http是應用層協議,它會將要傳輸的數據以明文的方式給傳輸層,這樣顯然不安全。https則是在應用層與傳輸層之間又加了一層,該層遵守SSL/TLS協議,用於數據加密。
12.如何驗證證書的合法性?
-
證書包含以下信息:申請者公鑰、申請者的組織信息和個人信息、簽發機構 CA 的信息、有效時間、證書序列號等信息的明文,同時包含一個簽名;
-
簽名的產生算法:首先,使用散列函數計算公開的明文信息的信息摘要,然後,採用 CA 的私鑰對信息摘要進行加密,密文即簽名;
客戶端在對服務器say hello之後,服務器將公開密鑰證書發送給客戶端,注意這個證書裏面包含了公鑰+各種信息+簽名(私鑰對各種信息加密後生成簽名),客戶端收到公開密鑰證書後,相當於收到了一個包裹裏面有公鑰+各種信息+簽名,怎麼樣使用這三個數據來校驗尼,很簡單,公鑰加密,私鑰解,私鑰加密公鑰也可以解,只要利用公鑰對簽名進行解密,然後最和各種信息做比較就可以校驗出證書的合法性
13.https中哪裏用了對稱加密,哪裏用了非對稱加密,對加密算法(如RSA)等是否有了解?
參考8
14.client如何確定自己發送的消息被server收到?
15.談談你對WebSocket的理解
16.WebSocket與socket的區別
17.談談你對安卓簽名的理解。
18.請解釋安卓爲啥要加簽名機制?
19.視頻加密傳輸
20.App 是如何沙箱化,爲什麼要這麼做?
21.權限管理系統(底層的權限是如何進行 grant 的)?
源碼理解
-
Glide :加載、緩存、LRU 算法 (如何自己設計一個大圖加載框架) (LRUCache 原理)
-
EventBus
-
LeakCanary
-
ARouter
-
插件化(不同插件化機制原理與流派,優缺點。侷限性)
-
熱修復
-
RXJava (RxJava 的線程切換原理)
-
Retrofit (Retrofit 在 OkHttp 上做了哪些封裝?動態代理和靜態代理的區別,是怎麼實現的)
-
OkHttp
Kotlin 相關
1.從原理分析Kotlin的延遲初始化: lateinit var和by lazy
2.使用Kotlin Reified 讓泛型更簡單安全
3.Kotlin裏的Extension Functions實現原理分析
4.Kotlin系列之頂層函數和屬性
5.Kotlin 兼容 Java 遇到的最大的 “坑”
6.Kotlin 的協程用力瞥一眼
7.Kotlin 協程「掛起」的本質
8.到底什麼是「非阻塞式」掛起?協程真的更輕量級嗎?
9.資源混淆是如何影響到Kotlin協程的
10.Kotlin Coroutines(協程) 完全解析
11.破解 Kotlin 協程
Flutter相關
-
Dart 當中的 「..」表示什麼意思?
-
Dart 的作用域
-
Dart 是不是單線程模型?是如何運行的?
-
Dart 是如何實現多任務並行的?
-
說一下Dart異步編程中的 Future關鍵字?
-
說一下Dart異步編程中的 Stream數據流?
-
Stream 有哪兩種訂閱模式?分別是怎麼調用的?
-
await for 如何使用?
-
說一下 mixin機制?
-
請簡單介紹下Flutter框架,以及它的優缺點?
-
介紹下Flutter的理念架構
-
介紹下FFlutter的FrameWork層和Engine層,以及它們的作用
-
介紹下Widget、State、Context 概念 - Widget
14.簡述Widget的StatelessWidget和StatefulWidget兩種狀態組件類
15.StatefulWidget 的生命週期
16.簡述Widgets、RenderObjects 和 Elements的關係
17.什麼是狀態管理,你瞭解哪些狀態管理框架?
18.簡述Flutter的繪製流程
19.簡述Flutter的線程管理模型
20.Flutter 是如何與原生Android、iOS進行通信的?
21.簡述Flutter 的熱重載
最後
其實Android開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。
上面分享的騰訊、頭條、阿里、美團、字節跳動等公司2019-2020年的高頻面試題,博主還把這些技術點整理成了視頻和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由於篇幅有限,上面只是以圖片的形式給大家展示一部分。
出自:https://www.jianshu.com/p/a8f7048a1575