5年Android提升面試題

在博主認爲,對於Android面試以及進階的最佳學習方法莫過於刷題+博客+書籍+總結,前三者博主將淋漓盡致地揮毫於這篇博客文章中,至於總結在於個人,實際上越到後面你會發現面試並不難,其次就是在刷題的過程中有沒有去思考,刷題只是次之,這又是一個層次了,這裏暫時不提後面再談。

博主總結了一系列大廠面試中常問的面試技術點,深入解析以及答案,將爲最近準備面試的各開發者去大廠保駕護航,

何謂面試? 博主所理解的面試,它是一個過程,是不斷沉澱、不斷總結、善於傳達自己的專業領域技術以及解決問題能力的過程。以下是博主總結的一些面試題,文中如有錯誤,懇請批評指正!

Java相關

 

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

  2. 內存模型

  3. 垃圾回收算法(JVM)

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

  5. 類加載過程(需要多看看,重在理解,對於熱修復和插件化比較重要)

  6. 反射

  7. 多線程和線程池

  8. 設計模式(六大基本原則、項目中常用的設計模式、手寫單例等)

  9. Java 四大引用

  10. Java 的泛型

  11. final、finally、finalize 的區別

  12. 接口、抽象類的區別

     

Android 相關

 

  1. 自定義 View

  2. 事件攔截分發

  3. 解決過的一些性能問題,在項目中的實際運用

  4. 性能優化工具

  5. 性能優化 (講講你自己項目中做過的性能優化)

  6. Http[s]請求慢的解決辦法(DNS、攜帶數據、直接訪問 IP)

  7. 緩存自己如何實現(LRUCache 原理)

  8. 圖形圖像相關:OpenGL ES 管線流程、EGL 的認識、Shader 相關

  9. SurfaceView、TextureView、GLSurfaceView 區別及使用場景

  10. 動畫、差值器、估值器(Android中的View動畫和屬性動畫 - 簡書、Android 動畫 介紹與使用)

  11. MVC、MVP、MVVM

  12. Handler、ThreadLocal、AsyncTask、IntentService 原理及應用

  13. Gradle(Groovy 語法、Gradle 插件開發基礎)

  14. 熱修復、插件化

  15. 組件化架構思路

  16. 系統打包流程

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

  18. SharedPrefrence 源碼和問題點;

  19. sqlite 相關

  20. 如何判斷一個 APP 在前臺還是後臺?

  21. AMS 、PMS

  22. Activity 啓動流程,App 啓動流程

  23. Binder 機制(IPC、AIDL 的使用)

  24. 爲什麼使用 Parcelable,好處是什麼?

  25. Android 圖像顯示相關流程,Vsync 信號等

     

     

算法與數據結構

 

  1. 時間複雜度 / 空間複雜度

  2. 常用的排序算法有哪些?

  3. 字符串反轉

  4. 鏈表反轉(頭插法)

  5. 如何查找第一個只出現一次的字符(Hash查找)

  6. 如何查找兩個子視圖的共同父視圖?

  7. 無序數組中的中位數(快排思想)

  8. 如何給定一個整數數組和一個目標值,找出數組中和爲目標值的兩個數。

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

  10. 最大 K 問題

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

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

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

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

  15. 鏈表每 k 位逆序;

  16. 鏡像二叉樹;

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

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

  19. String 方式計算加法。

網絡

Http協議總結(面試)

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的連接建立流程

  1. client向server發送請求https://baidu.com,然後連接到server的443端口,發送的信息主要是隨機值1和客戶端支持的加密算法。
  2. server接收到信息之後給予client響應握手信息,包括隨機值2和匹配好的協商加密算法,這個加密算法一定是client發送給server加密算法的子集。
  3. 隨即server給client發送第二個響應報文是數字證書。服務端必須要有一套數字證書,可以自己製作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,纔可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面,這套證書其實就是一對公鑰和私鑰。傳送證書,這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發機構,過期時間、服務端的公鑰,第三方證書認證機構(CA)的簽名,服務端的域名信息等內容。
  4. 客戶端解析證書,這部分工作是由客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成一個隨即值(預主祕鑰)。
  5. 客戶端認證證書通過之後,接下來是通過隨機值1、隨機值2和預主祕鑰組裝會話祕鑰。然後通過證書的公鑰加密會話祕鑰。
  6. 傳送加密信息,這部分傳送的是用證書加密後的會話祕鑰,目的就是讓服務端使用祕鑰解密得到隨機值1、隨機值2和預主祕鑰。
  7. 服務端解密得到隨機值1、隨機值2和預主祕鑰,然後組裝會話祕鑰,跟客戶端會話祕鑰相同。
  8. 客戶端通過會話祕鑰加密一條消息發送給服務端,主要驗證服務端是否正常接受客戶端加密的消息。
  9. 同樣服務端也會通過會話祕鑰加密一條消息回傳給客戶端,如果客戶端能夠正常接受的話表明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

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解析過程

淺析DNS域名解析過程 

8、HTTPS實現原理:SSL建立鏈接過程

  1. client向server發送請求https://baidu.com,然後連接到server的443端口,發送的信息主要是隨機值1和客戶端支持的加密算法。
  2. server接收到信息之後給予client響應握手信息,包括隨機值2和匹配好的協商加密算法,這個加密算法一定是client發送給server加密算法的子集。
  3. 隨即server給client發送第二個響應報文是數字證書。服務端必須要有一套數字證書,可以自己製作,也可以向組織申請。區別就是自己頒發的證書需要客戶端驗證通過,纔可以繼續訪問,而使用受信任的公司申請的證書則不會彈出提示頁面,這套證書其實就是一對公鑰和私鑰。傳送證書,這個證書其實就是公鑰,只是包含了很多信息,如證書的頒發機構,過期時間、服務端的公鑰,第三方證書認證機構(CA)的簽名,服務端的域名信息等內容。
  4. 客戶端解析證書,這部分工作是由客戶端的TLS來完成的,首先會驗證公鑰是否有效,比如頒發機構,過期時間等等,如果發現異常,則會彈出一個警告框,提示證書存在問題。如果證書沒有問題,那麼就生成一個隨即值(預主祕鑰)。
  5. 客戶端認證證書通過之後,接下來是通過隨機值1、隨機值2和預主祕鑰組裝會話祕鑰(這個會話密鑰屬於對稱加密)。然後通過證書的公鑰加密會話祕鑰。
  6. 傳送加密信息,這部分傳送的是用證書加密後的會話祕鑰,目的就是讓服務端使用祕鑰解密得到隨機值1、隨機值2和預主祕鑰。
  7. 服務端解密得到隨機值1、隨機值2和預主祕鑰,然後組裝會話祕鑰,跟客戶端會話祕鑰相同。
  8. 客戶端通過會話祕鑰加密一條消息發送給服務端,主要驗證服務端是否正常接受客戶端加密的消息。
  9. 同樣服務端也會通過會話祕鑰加密一條消息回傳給客戶端,如果客戶端能夠正常接受的話表明SSL層連接建立完成了。
     

10.HTTP報文結構

關於HTTP協議,一篇就夠了

Http協議由什麼組成

請求報文包括三部分:

  • (1).請求行:包含請求方法,URI,HTTP版本協議
  • (2).請求首部字段
  • (3).請求內容實體

      響應報文包含三部分:

  • (1).狀態行:包含HTTP版本,狀態碼,狀態碼原因短語
  • (2).響應首部字段
  • (3).響應內容實體

11.HTTP與HTTPS的區別以及如何實現安全性

http是應用層協議,它會將要傳輸的數據以明文的方式給傳輸層,這樣顯然不安全。https則是在應用層與傳輸層之間又加了一層,該層遵守SSL/TLS協議,用於數據加密。

12.如何驗證證書的合法性?

  1. 證書包含以下信息:申請者公鑰、申請者的組織信息和個人信息、簽發機構 CA 的信息、有效時間、證書序列號等信息的明文,同時包含一個簽名;

  2. 簽名的產生算法:首先,使用散列函數計算公開的明文信息的信息摘要,然後,採用 CA 的私鑰對信息摘要進行加密,密文即簽名;

客戶端在對服務器say hello之後,服務器將公開密鑰證書發送給客戶端,注意這個證書裏面包含了公鑰+各種信息+簽名(私鑰對各種信息加密後生成簽名),客戶端收到公開密鑰證書後,相當於收到了一個包裹裏面有公鑰+各種信息+簽名,怎麼樣使用這三個數據來校驗尼,很簡單,公鑰加密,私鑰解,私鑰加密公鑰也可以解,只要利用公鑰對簽名進行解密,然後最和各種信息做比較就可以校驗出證書的合法性

13.https中哪裏用了對稱加密,哪裏用了非對稱加密,對加密算法(如RSA)等是否有了解?

參考8

14.client如何確定自己發送的消息被server收到?

15.談談你對WebSocket的理解

16.WebSocket與socket的區別

17.談談你對安卓簽名的理解。

18.請解釋安卓爲啥要加簽名機制?

19.視頻加密傳輸

20.App 是如何沙箱化,爲什麼要這麼做?

21.權限管理系統(底層的權限是如何進行 grant 的)?

 

 

源碼理解

  1. Glide :加載、緩存、LRU 算法 (如何自己設計一個大圖加載框架) (LRUCache 原理)

  2. EventBus

  3. LeakCanary

  4. ARouter

  5. 插件化(不同插件化機制原理與流派,優缺點。侷限性)

  6. 熱修復

  7. RXJava (RxJava 的線程切換原理)

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

  9. 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相關

  1. Dart 當中的 「..」表示什麼意思?

  2. Dart 的作用域

  3. Dart 是不是單線程模型?是如何運行的?

  4. Dart 是如何實現多任務並行的?

  5. 說一下Dart異步編程中的 Future關鍵字?

  6. 說一下Dart異步編程中的 Stream數據流?

  7. Stream 有哪兩種訂閱模式?分別是怎麼調用的?

  8. await for 如何使用?

  9. 說一下 mixin機制?

  10. 請簡單介紹下Flutter框架,以及它的優缺點?

  11. 介紹下Flutter的理念架構

  12. 介紹下FFlutter的FrameWork層和Engine層,以及它們的作用

  13. 介紹下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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章