1. 程式人生 > 實用技巧 >【建議收藏】Android中高階大廠面試祕籍,為你備戰2021金三銀四,直通大廠

【建議收藏】Android中高階大廠面試祕籍,為你備戰2021金三銀四,直通大廠

一眨眼又到年底了,每到這個時候,我們都會慢慢反思,這一年都做了什麼?有什麼進步?年初的計劃都實現了嗎?明年年初有跳槽的底氣了嗎?

況且2020年我們經歷了新冠疫情的洗禮,很多程式設計師都經歷了失業,找工作的恐慌。導致今年的網際網路環境太差,需要自己有足夠的知識儲備,才能夠應對這凌冽的寒風。

本文主要是整理了中高階Android需要會的(或者說面試被頻繁問到的內容),主要作為參考大綱,之後會陸續更新每個詳細部分,供大家參考,互相學習。

一、計算機網路部分

1.網頁中輸入url,到渲染整個介面的整個過程,以及中間用了什麼協議?
1)過程分析:主要分為三步

DNS解析。使用者輸入url後,需要通過DNS解析找到域名對應的ip地址,有了ip地址才能找到伺服器端。首先會查詢瀏覽器快取,是否有對應的dns記錄。再繼續按照作業系統快取—路由快取—isp的dns伺服器—根伺服器的順序進行DNS解析,直到找到對應的ip地址。
客戶端(瀏覽器)和伺服器互動。瀏覽器根據解析到的ip地址和埠號發起HTTP請求,請求到達傳輸層,這裡也就是TCP層,開始三次握手建立連線。伺服器收到請求後,傳送相應報文給客戶端(瀏覽器),客戶端收到相應報文並進行解析,得到html頁面資料,包括html,js,css等。
客戶端(瀏覽器)解析html資料,構建DOM樹,再構造呈現樹(render樹),最終繪製到瀏覽器頁面上。
2)其中涉及到TCP/IP協議簇,包括DNS,TCP,IP,HTTP協議等等。

2.具體介紹下TCP/IP
TCP/IP一般指的是TCP/IP協議簇,主要包括了多個不同網路間實現資訊傳輸涉及到的各種協議
主要包括以下幾層:

應用層:主要提供資料和服務。比如HTTP,FTP,DNS等
傳輸層:負責資料的組裝,分塊。比如TCP,UDP等
網路層:負責告訴通訊的目的地,比如IP等
資料鏈路層:負責連線網路的硬體部分,比如乙太網,WIFI等
TCP的三次握手和四次揮手,為什麼不是兩次握手?為什麼揮手多一次呢?
客戶端簡稱A,伺服器端簡稱B
1)TCP建立連線需要三次握手

A向B表示想跟B進行連線(A傳送syn包,A進入SYN_SENT狀態)
B收到訊息,表示我也準備好和你連線了(B收到syn包,需要確認syn包,並且自己也傳送一個syn包,即傳送了syn+ack包,B進入SYN_RECV狀態)
A收到訊息,並告訴B表示我收到你也準備連線的訊號了(A收到syn+ack包,向伺服器傳送確認包ack,AB進入established狀態)開始連線。
2)TCP斷開連線需要四次揮手

A向B表示想跟B斷開連線(A傳送fin,進入FIN_WAIT_1狀態)
B收到訊息,但是B訊息沒傳送完,只能告訴A我收到你的斷開連線訊息(B收到fin,傳送ack,進入CLOSE_WAIT狀態)
過一會,B資料傳送完畢,告訴A,我可以跟你斷開了(B傳送fin,進入LAST_ACK狀態)
A收到訊息,告訴B,可以他斷開(A收到fin,傳送ack,B進入closed狀態)
3)為什麼揮手多一次
其實正常的斷開和連線都是需要四次:

A發訊息給B
B反饋給A表示正確收到訊息
B傳送訊息給A
A反饋給B表示正確收到訊息。
但是連線中,第二步和第三步是可以合併的,因為連線之前A和B是無聯絡的,所以沒有其他情況需要處理。而斷開的話,因為之前兩端是正常連線狀態,所以第二步的時候不能保證B之前的訊息已經發送完畢,所以不能馬上告訴A要斷開的訊息。這就是連線為什麼可以少一步的原因。

4)為什麼連線需要三次,而不是兩次。
正常來說,我給你發訊息,你告訴我能收到,不就代表我們之前通訊是正常的嗎?

簡單回答就是,TCP是雙向通訊協議,如果兩次握手,不能保證B發給A的訊息正確到達。
TCP 協議為了實現可靠傳輸, 通訊雙方需要判斷自己已經發送的資料包是否都被接收方收到, 如果沒收到, 就需要重發。

3.TCP是怎麼保證可靠傳輸的?

序列號和確認號。比如連線的一方傳送一段80byte資料,會帶上一個序列號,比如101。接收方收到資料,回覆確認號181(180+1),這樣下一次傳送訊息就會從181開始傳送了。
所以握手過程中,比如A傳送syn訊號給B,初始序列號為120,那麼B收到訊息,回覆ack訊息,序列號為120+1。同時B傳送syn訊號給A,初始序列號為256,如果收不到A的回覆訊息,就會重發,否則丟失這個序列號,就無法正常完成後面的通訊了。

這就是三次握手的原因。

4.TCP和UDP的區別?
TCP提供的是面向連線,可靠的位元組流服務。即客戶和伺服器交換資料前,必須現在雙方之間建立一個TCP連線(三次握手),之後才能傳輸資料。並且提供超時重發,丟棄重複資料,檢驗資料,流量控制等功能,保證資料能從一端傳到另一端。

UDP 是一個簡單的面向資料報的運輸層協議。它不提供可靠性,只是把應用程式傳給IP層的資料報傳送出去,但是不能保證它們能到達目的地。由於UDP在傳輸資料報前不用再客戶和伺服器之間建立一個連線,且沒有超時重發等機制,所以傳輸速度很快。

所以總結下來就是:

TCP 是面向連線的,UDP 是面向無連線的
TCP資料報頭包括序列號,確認號,等等。相比之下UDP程式結構較簡單。
TCP 是面向位元組流的,UDP 是基於資料報的
TCP 保證資料正確性,UDP 可能丟包
TCP 保證資料順序,UDP 不保證
可以看到TCP適用於穩定的應用場景,他會保證資料的正確性和順序,所以一般的瀏覽網頁,介面訪問都使用的是TCP傳輸,所以才會有三次握手保證連線的穩定性。
而UDP是一種結構簡單的協議,不會考慮丟包啊,建立連線等。優點在於資料傳輸很快,所以適用於直播,遊戲等場景。

5.HTTP的幾種請求方法具體介紹
常見的有四種:

GET 獲取資源,沒有body,冪等性
POST 增加或者修改資源,有body
PUT 修改資源,有body,冪等性
DELETE 刪除資源,冪等性
HTTP請求和響應報文的格式,以及常用狀態碼
1)請求報文:

   //請求行(包括method、path、HTTP版本)
   GET /s HTTP/1.1
   //Headers
   Host: www.baidu.com
   Content-Type: text/plain
   //Body
   搜尋****
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2)響應報文

   //狀態行 (包括HTTP版本、狀態碼,狀態資訊)
   HTTP/1.1 200 OK
   //Headers
   Content-Type: application/json; charset=utf-8
   //Body
   [{"info":"xixi"}]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3)常用狀態碼

主要分為五種型別:

1開頭, 代表臨時性訊息,比如100(繼續傳送)
2開頭, 代表請求成功,比如200(OK)
3開頭, 代表重定向,比如304(內容無改變)
4開頭, 代表客戶端的一些錯誤,比如403(禁止訪問)
5開頭, 代表伺服器的一些錯誤,比如500
  • 1
  • 2
  • 3
  • 4
  • 5

6.請回答一個 TCP 連線上面能發多少個 HTTP 請求?

二、 資料結構與演算法

1.1.1 常用的資料結構有哪些?
1.1.2 陣列
(1).如何在一個1到100的整數陣列中找到丟失的數字

相關知識點: [陣列](javascript: void(0))[數學](javascript: void(0))[位運算](javascript: void(0))

相關知識點: [陣列](javascript: void(0))[數學](javascript: void(0))[位運算](javascript: void(0))?
(2).如何在給定的整數陣列中找到重複的數字? (小米
(3).如何在未排序整數陣列中找到最大值和最小值?(位元組跳動
(4).在Java中如何從給定陣列中刪除多重複制?
(5).大數相加(今日頭條)

1.1.3連結串列
(1).那查詢第一個跟倒數第二個呢?(這就不一樣了,第一個直接給了頭結點,倒數第二個需要從倒數第一個開始查詢,走兩步) (騰訊
(2).arrayList底層原理 (滴滴位元組跳動
(3).如何在一次遍歷中找到單個連結串列的中值?(中國平安
(4).如何證明給定的連結串列是否包含迴圈?如何找到迴圈的頭節點?(優酷)
(5).兩個有交叉的單連結串列,求交叉點 (華為
(6).如何得到單連結串列的長度? 360
(7).如何在不使用遞迴的情況下逆轉單鏈表?小米/美團
(8).怎麼判斷連結串列有環? (滴滴
1.1.4 佇列&堆疊
(1).如何使用棧實現佇列的功能?(廣州荔枝FM)
(2).兩個棧實現一個佇列蘑菇街
(3).兩個佇列實現一個棧 (騰訊
(4).對比一下佇列和棧,以及它們底部實現 (騰訊

1.1.5二叉樹
(1).如何在給定的二叉樹中執行先序遍歷?百度
(2).如何實現後序遍歷演算法?百度
(3).如何在給定陣列中執行二分法搜尋?蘇寧
(4).已知前序遍歷為{1,2,4,7,3,5,6,8},中序遍歷為{4,7,2,1,5,3,8,6},它的二叉樹是怎麼樣的?58
(5).輸入兩棵二叉樹A 和 B,判斷 B 是不是 A 的子結構。 (愛奇藝
(6).請實現兩個函式,分別用來序列化二叉樹和反序列化二叉樹。 (YY)
(7).平衡二叉樹紅黑樹的區別?(位元組跳動
(8).什麼是平衡二叉樹,它有什麼特徵 (美團
(9).B 樹,B+樹

1.1.6 HashMap
(1).HashMap的底層原理是什麼?執行緒安全麼? (百度美團
(2).HashMap中put是如何實現的? (滴滴
(3).談一下hashMap中什麼時候需要進行擴容,擴容resize()又是如何實現的?
(4).什麼是雜湊碰撞?怎麼解決? (滴滴美團
(5).HashMap和HashTable的區別 (小米
(6).HashMap中什麼時候需要進行擴容,擴容resize()是如何實現的? (滴滴
(7).hashmap concurrenthashmap原理 (美團
(8).arraylist和hashmap的區別,為什麼取數快?(位元組跳動
1.1.7圖
(1).旋轉輸出矩陣
(2).給定一個矩陣 int matrixA[m][n],每行每列都是增序的,實現一個演算法去尋找矩陣中的某個元素 element.搜狗

1.1.8排序演算法有哪些?
(1).top-k排序(堆排序,點陣圖法) (美團
(2).冒泡排序的手寫 (華捷艾米)
(3).堆排序演算法的手寫 (華捷艾米)
(4).橢圓形場地有兩個賽道,可以同時提供兩匹馬比賽,兩匹馬比賽後,可以獲知兩匹馬中跑的快的那匹馬,但是沒有計時工具。問題,如何最優的演算法(比賽次數最少),獲知10匹馬中速度最快的三匹馬 (阿里)
(5).輸入一個整型無序陣列,對堆排序的方法使得陣列有序 (阿里)
(6).如何使用快速排序演算法對整數陣列進行排序? (CVTE
1.1.9 查詢演算法
(1).有序陣列的二分查詢演算法百度
1.1.10 串
(1).給定一個字串,請你找出其中不含有重複字元的 最長子串的長度。 (位元組跳動
(2).給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為 1000。
1.1.11 請寫出以下演算法的時間複雜度
冒泡排序法 插入排序法 堆排序二叉樹排序
1.1.12 其他演算法
(1).常用的對稱加密演算法,有什麼同? (位元組跳動
(2).如何在無序(有負數)的陣列中查詢是否存在和為target的兩個數組合,twoSum();(位元組)

三、Java面試題

  1. 容器(HashMap、HashSet、LinkedList、ArrayList、陣列等)

需要了解其實現原理,還要靈活運用,如:自己實現 LinkedList、兩個棧實現一個佇列,陣列實現棧,佇列實現棧等。

HashMap、HashTable 和 CurrentHashMap 的核心區別(併發),其次內部資料結構的實現、擴容、存取操作,再深一點 雜湊碰撞,雜湊計算,雜湊對映,為什麼是頭插法,擴容為什麼是 2 的冪次等。

參考連結

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

  1. 記憶體模型

參考連結

理解Java記憶體模型
你瞭解Java記憶體模型麼(Java7、8、9記憶體模型的區別)

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

當你講到分代回收演算法的時候,不免會被追問到新生物件是怎麼從年輕代到老年代的,以及可以作為 root 結點的物件有哪些兩個問題。

  • 1
  • 2
  • 3
  • 4

1、談談對 JVM 的理解?
2、JVM 記憶體區域,開執行緒影響哪塊區域記憶體?
3、對 Dalvik、ART 虛擬機器有什麼瞭解?對比?

ART 的機制與 Dalvik 不同。在Dalvik下,應用每次執行的時候,位元組碼都需要通過即時編譯器(just in time ,JIT)轉換為機器碼,這會拖慢應用的執行效率,而在ART 環境中,應用在第一次安裝的時候,位元組碼就會預先編譯成機器碼,極大的提高了程式的執行效率,同時減少了手機的耗電量,使其成為真正的本地應用。這個過程叫做預編譯(AOT,Ahead-Of-Time)。這樣的話,應用的啟動(首次)和執行都會變得更加快速。

優點:

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

缺點:

  • 機器碼佔用的儲存空間更大,位元組碼變為機器碼之後,可能會增加10%-20%(不過在應用包中,可執行的程式碼常常只是一部分。比如最新的 Google+ APK 是 28.3 MB,但是程式碼只有 6.9 MB。)
  • 應用的安裝時間會變長。

4、垃圾回收機制和呼叫 System.gc()的區別?

參考連結

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

  1. 類載入過程(需要多看看,重在理解,對於熱修復和外掛化比較重要)
  2. 反射
  3. 多執行緒和執行緒池
執行緒有哪些狀態,哪些鎖,各種鎖的區別

併發程式設計:
synchronized 和 volatile 、ReentrantLock 、CAS 的區別

synchronized 修飾例項方法和修飾靜態方法有啥不一樣。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

sleep 、wait、yield 的區別,wait 的執行緒如何喚醒它

  1. 設計模式(六大基本原則、專案中常用的設計模式、手寫單例等)
1、生產者模式和消費者模式的區別?
2、單例模式雙重加鎖,為什麼這樣做?
3、知道的設計模式有哪些?
4、專案中常用的設計模式有哪些?
5、手寫生產者、消費者模式。
6、手寫觀察者模式程式碼。
7、介面卡模式、裝飾者模式、外觀模式的異同?
8、談談對 java 狀態機的理解。
9、談談應用更新(灰度、強制更新、分割槽更新?)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 斷點續傳
  2. Java 四大引用
強引用、軟引用、弱引用、虛引用的區別以及使用場景。

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

稍微問的深一些的面試官會和記憶體洩漏檢測原理以及垃圾回收糅雜在一起。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. Java 的泛型,<? super T> 和 <? extends T> 的區別
問到泛型、泛型擦除、萬用字元相關的東西

  • 1
  • 2
  1. final、finally、finalize 的區別
  2. 介面、抽象類的區別

四、Android面試題

1、Activity啟動模式

2、Activity的啟動過程

3 、程序通訊

4、Android Binder之應用層總結與分析

5.程序保活方法

6.從原始碼瞭解handler looper ,messageQueue思路 312

7.handler如何實現延時發訊息postdelay() 315

8.Android中為什麼主執行緒不會因為Looper.loop()裡的死迴圈卡死? 320

9.RxJava原理及如何封裝使用 334

10.okhttp原始碼分析

11.retrofit原始碼分析

12.LeakCanary核心原理原始碼淺析

13.LruCache 使用及原理

14.ARouter原理

15.註解框架實現原理

16.Android 如何編寫基於編譯時註解的專案

17.RxJava2+Retrofit2+OkHttp3的基礎、封裝和專案中的使用

18.Rxjava2.0+Retrofit+Okhttp(封裝使用)+MVP框架搭建

19.Android 外掛化和熱修復知識梳理

20.Android開發中比較常見的記憶體洩漏問題及解決辦法

21.如何檢測和定位Android記憶體洩漏

22.圖片佔據的記憶體演算法

23.為什麼圖片需要用軟引用,MVP模式中的view介面用弱引用 580

24.基於DataBinding與LiveData的MVVM實踐

25.App穩定性優化

26.App啟動速度優化

27.App記憶體優化

28.App繪製優化

29.App瘦身

30.網路優化

31.App電量優化

32.安卓的安全優化

33.為什麼WebView載入會慢呢?

34.如何優化自定義View

最後

面試是跳槽漲薪最直接有效的方式,備戰2021金三銀四,各位做好面試造飛機,工作擰螺絲的準備了嗎?

掌握了這些知識點,面試時在候選人中又可以奪目不少,暴擊9999點。機會都是留給有準備的人,只有充足的準備,才可能讓自己可以在候選人中脫穎而出。

如果你需要這份完整版的面試筆記,只需你多多支援我這篇文章。

多多支援,即可免費獲取資料——三連之後(承諾:100%免費)

快速入手通道:(點這裡)下載!誠意滿滿!!!

Android面試精選題、架構實戰文件傳送門:https://docs.qq.com/doc/DRW1nUkdhZG5zeGVi

整理不易,覺得有幫助的朋友可以幫忙點贊分享支援一下小編~

你的支援,我的動力;祝各位前程似錦,offer不斷!!!