字節跳動 京東 360 網易面試題整理,騰訊Android面試題

mb612e29786577c 2021-09-20 02:44:37 阅读数:686

整理 android

網絡:分層模型、TCP、UDP、HTTP、HTTPS

分層模型

  • 應用層:負責處理特定的應用程序細節,如 HTTP、FTP、DNS
  • 運輸層:為兩臺主機提供端到端的基礎通信,如 TCP、UDP
  • 網絡層:控制分組傳輸、路由選擇等,如 IP
  • 鏈路層:操作系統設備驅動程序、網卡相關接口

UDP

  • UDP 頭結構:來源端口、目的端口、長度域、校驗和
  • 特點:不可靠、無序、面向報文、速度快、輕量
  • 適用場景:適用於即時通訊、視頻通話等
  • 應用:DHCP、DNS、QUCI、VXLAN、GTP-U、TFTP、SNMP

TCP

  • TCP 頭結構:來源端口、目的端口、序號、確認序號、SYN/ACK 等狀態比特、窗口大小、校驗和、緊急指針
  • 特點:面向字節流、有擁塞和流量控制、可靠、有序、速度慢、較重量,通過滑動窗口實現流量控制、用塞控制
  • 適用場景:文件傳輸、瀏覽器等
  • 應用:HTTP、HTTPS、RTMP、FTP、SMTP、POP3
  • 三次握手:
1\. C->S:SYN,seq=x(你能聽到嗎?)
2\. S->C:SYN,seq=y,ack=x+1(我能聽到,你能聽到嗎?)
3\. C->S:ACK,seq=x+1,ack=y+1(我能聽到,開始吧)
兩方都要能確保:我說的話,你能聽到;你說的話,我能聽到。所以需要三次握手
複制代碼

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 四次揮手:
1\. C->S:FIN,seq=p(我說完了)
2\. S->C:ACK,ack=p+1(我知道了,等一下,我可能還沒說完)
3\. S->C:FIN,seq=q,ACK,ack=p+1(我也說完了)
4\. C->S:ACK,ack=q+1(我知道了,結束吧)
S 收到 C 結束的消息後 S 可能還沒說完,沒法立即回複結束標示,只能等說完後再告訴 C :我說完了
複制代碼

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

HTTP

  • 超文本傳輸協議,明文傳輸,默認 80 端口
  • POST 和 GET:Get 參數放在 url 中;Post 參數放在 request Body 中
  • 訪問網頁過程:DNS 域名解析、TCP 三次握手建立連接、發起 HTTP 請求

HTTPS

  • 默認 443 端口,使用 SSL 協議對 HTTP 傳輸數據進行了加密,安全
  • 加密過程:Client/Server 通過非對稱加密生成密鑰,然後用這個密鑰去對稱加密傳輸數據

算法:數據結構、常用算法

數據結構

  • 數組、鏈錶
  • 棧、隊列
  • 散列錶
  • 樹、堆、圖

常用算法

  • 排序
  • 雙指針、滑動窗口、字符串
  • 遞歸、分治、二分
  • 回溯、貪心、動態規劃

Java 基礎:StringBuilder、泛型擦除、Exception、IO、容器

StringBuilder

  • StringBuffer 線程安全,StringBuilder 線程不安全
  • +實際上是用 StringBuilder 來實現的,所以非循環體可以直接用 +,循環體不行,因為會頻繁創建 StringBuilder
  • String.concat 實質是 new String ,效率也低,耗時排序:StringBuilder < StringBuffer < concat < +

泛型擦除

  • 修飾成員變量等類結構相關的泛型不會被擦除
  • 容器類泛型會被擦除

Exception 和 Error

  • Exception 和 Error 都繼承自 Throwable
  • Error 大部分是指不可恢複的錯誤狀態,比如 OOM,所以也不需要捕獲
  • Exception 分為 CheckedException 和 UnCheckedException
    • CheckedException:必須顯式捕獲,受編譯器檢查,比如 io 操作
    • UnCheckedException:不用顯示捕獲,比如空指針、數組越界等

IO 、 NIO、 OKIO

  • IO 是面向流的,一次一個字節的處理,NIO 是面向緩沖區的,一次產生或消費一個數據塊
  • IO 是阻塞的,NIO 是非阻塞的
  • NIO 支持內存映射方式
  • okio 相比 io 和 nio,api 更簡單易用
  • okio 支持超時機制
  • okio 引入 ByteString 空間換時間提高性能
  • okio 采用 segment 機制進行內存共享,節省 copy 時間消耗

ArrayList、LinkedList

  • ArrayList
    • 基於數組實現,查找快:o(1),增删慢:o(n)
    • 初始容量為10,擴容通過 System.arrayCopy 方法
  • LinkedList
    • 基於雙向鏈錶實現,查找慢:o(n),增删快:o(1)
    • 封裝了隊列和棧的調用

HashMap 、HashTable、HashSet

  • HashMap(允許 key/value 為 null)

    • 基於數組和單向鏈錶實現,數組是 HashMap 的主體;鏈錶是為解决哈希沖突而存在的,存放的是key和value結合的實體
    • 數組索引通過 key.hashCode(還會二次 hash) 得到,在鏈錶上通過 key.equals 索引
    • 哈希沖突落在同一個桶中時,直接放在鏈錶頭部(java1.8後放到尾部)
    • JAVA 8 中鏈錶數量大於 8 時會轉為紅黑樹存儲,查找時間由 O(n) 變為 O(logn)
    • 數組長度總是2的n次方:這樣就能通過比特運算實現取餘,從而讓 index 能落在數組長度範圍內
    • 加載因子(默認0.75)錶示添加到多少填充比時進行擴容,填充比大:鏈錶較長,查找慢;填充比小:鏈錶短,查找快
    • 擴容時直接創建原數組兩倍的長度,然後將原有對象再進行hash找到新的index,重新放
  • HashTable(不允許 key/value 為 null)

    • 數據結構和 HashMap 一樣
    • 線程安全
  • HashSet

    • 基於 HashMap 實現,元素就是 HashMap 的 key,Value 傳入了一個固定值

ArrayMap、SparseArray

  • ArrayMap

    • 基於兩個數組實現,一個存放 hash;一個存放鍵值對
    • 存放 hash 的數組是有序的,查找時使用二分法查找
    • 發生哈希沖突時鍵值對數組裏連續存放,查找時也是通過 key.equals索引,找不到時先向後再向前遍曆相同hash值的鍵值對數組
    • 擴容時不像 HashMap 直接 double,內存利用率高;也不需要重建哈希錶,只需要調用 system.arraycopy 數組拷貝,性能較高
    • 不適合存大量數據(1000以下),因為數據量大的時候二分查找相比紅黑樹會慢很多
  • SparseArray

    • 基於 ArrayMap,key 只能是特定類型

Concurrent 集合

  • ConcurrentHashMap
    • 數據結構跟 HashMap 一樣,還是數組加鏈錶
    • 采用 segment 分段鎖技術,不像 HashTable 無腦直接同步 put 和 get 操作
    • get 操作沒有加鎖,因為 value 用 volatile 修飾來保證可見行,性能很高
    • java1.8 後去除分段鎖,采用 CAS 樂觀鎖加 synchronized 來實現

LRUCache 原理

  • 基於訪問順序排序的 LinkedHashMap 實現,最近訪問的會排在最後

最後

我見過很多技術leader在面試的時候,遇到處於迷茫期的大齡程序員,比面試官年齡都大。這些人有一些共同特征:可能工作了5、6年,還是每天重複給業務部門寫代碼,工作內容的重複性比較高,沒有什麼技術含量的工作。問到這些人的職業規劃時,他們也沒有太多想法。

其實30歲到40歲是一個人職業發展的黃金階段,一定要在業務範圍內的擴張,技術廣度和深度提昇上有自己的計劃,才有助於在職業發展上有持續的發展路徑,而不至於停滯不前。

不斷奔跑,你就知道學習的意義所在!

字節跳動 京東 360 網易面試題整理,騰訊Android面試題_Android

 CodeChina開源項目:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》

字節跳動 京東 360 網易面試題整理,騰訊Android面試題_程序員_02

版权声明:本文为[mb612e29786577c]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210920024436863L.html