一眨眼又到年底了,每到這個時候,我們都會慢慢反思,這一年都做了什么?有什么進步?年初的計劃都實作了嗎?明年年初有跳槽的底氣了嗎?
況且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
搜索****
2)回應報文
//狀態行 (包括HTTP版本、狀態碼,狀態資訊)
HTTP/1.1 200 OK
//Headers
Content-Type: application/json; charset=utf-8
//Body
[{"info":"xixi"}]
3)常用狀態碼
主要分為五種型別:
1開頭, 代表臨時性訊息,比如100(繼續發送)
2開頭, 代表請求成功,比如200(OK)
3開頭, 代表重定向,比如304(內容無改變)
4開頭, 代表客戶端的一些錯誤,比如403(禁止訪問)
5開頭, 代表服務器的一些錯誤,比如500
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面試題
- 容器(HashMap、HashSet、LinkedList、ArrayList、陣列等)
需要了解其實作原理,還要靈活運用,如:自己實作 LinkedList、兩個堆疊實作一個佇列,陣列實作堆疊,佇列實作堆疊等,
HashMap、HashTable 和 CurrentHashMap 的核心區別(并發),其次內部資料結構的實作、擴容、存取操作,再深一點 哈希碰撞,哈希計算,哈希映射,為什么是頭插法,擴容為什么是 2 的冪次等,
參考鏈接
JAVA容器-自問自答學HashMap
什么是HashMap?
從原始碼角度認識ArrayList,LinkedList與HashMap
- 記憶體模型
參考鏈接
理解Java記憶體模型
你了解Java記憶體模型么(Java7、8、9記憶體模型的區別)
- 垃圾回收演算法(JVM)
JVM 類加載機制、垃圾回收演算法對比、Java 虛擬機結構
當你講到分代回收演算法的時候,不免會被追問到新生物件是怎么從年輕代到老年代的,以及可以作為 root 結點的物件有哪些兩個問題,
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)你只要看這一篇就夠了!
- 類加載程序(需要多看看,重在理解,對于熱修復和插件化比較重要)
- 反射
- 多執行緒和執行緒池
執行緒有哪些狀態,哪些鎖,各種鎖的區別
并發編程:
synchronized 和 volatile 、ReentrantLock 、CAS 的區別
synchronized 修飾實體方法和修飾靜態方法有啥不一樣,
sleep 、wait、yield 的區別,wait 的執行緒如何喚醒它
- 設計模式(六大基本原則、專案中常用的設計模式、手寫單例等)
1、生產者模式和消費者模式的區別?
2、單例模式雙重加鎖,為什么這樣做?
3、知道的設計模式有哪些?
4、專案中常用的設計模式有哪些?
5、手寫生產者、消費者模式,
6、手寫觀察者模式代碼,
7、配接器模式、裝飾者模式、外觀模式的異同?
8、談談對 java 狀態機的理解,
9、談談應用更新(灰度、強制更新、磁區更新?)
- 斷點續傳
- Java 四大參考
強參考、軟參考、弱參考、虛參考的區別以及使用場景,
強參考置為 null,會不會被回收?
稍微問的深一些的面試官會和記憶體泄漏檢測原理以及垃圾回收糅雜在一起,
- Java 的泛型,<? super T> 和 <? extends T> 的區別
問到泛型、泛型擦除、通配符相關的東西
- final、finally、finalize 的區別
- 介面、抽象類的區別
…
四、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不斷!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/239668.html
標籤:其他
下一篇:人類能看懂的衍射光學公式(內含基爾霍夫公式,瑞利--索末菲公式,角譜衍射公式,菲涅爾積分公式,以及菲涅爾衍射的S-FFT,T-FFT,D-FFT演算法))






