大厂Offer拿到手软啊!技术详细介绍
生活随笔
收集整理的這篇文章主要介紹了
大厂Offer拿到手软啊!技术详细介绍
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
面試了一位工作12年的程序員,
這位老哥有3年java開發經驗,2年H5,7年Android開發經驗,簡歷上寫著精通Java,Android,熟悉H5開發。沒有具體的技術點。
說實話我很期待這位老哥的面試,于是讓人事邀約了他。
老哥面試的氣場很足,我也很尊敬他,一大波的自我介紹之后,我們進入了正題。
我問了他Jetpack,他說幾乎沒用過Jetpack,于是我給他舉了個小例子,老哥給我的答案是百度可以解決。
于是我又問了他Groovy,老哥還是說不清楚,于是我問了最基礎的Handler,Binder等幾個關鍵詞,依舊說不清楚,老哥依舊那么強勢霸氣,他給到我的感覺就是“啥都會做,你別問這些沒用的”。
看著他簡歷上寫著,精通安卓開發,熟悉跨平臺開發,js交互,我問了一句了解Flutter嗎?他說不知道沒聽過,最后問了一句期望薪資他說25k,我不知道問什么了,于是匆匆結束了面試。
網絡:分層模型、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
- 三次握手:
- 四次揮手:
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 實現,最近訪問的會排在最后
最后
愿你有一天,真愛自己,善待自己。
本文在開源項目:Android開發不會這些?如何面試拿高薪?中已收錄,里面包含不同方向的自學編程路線、面試題集合/面經、及系列技術文章等,資源持續更新中…
總結
以上是生活随笔為你收集整理的大厂Offer拿到手软啊!技术详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 条形码编程实例
- 下一篇: 科技战疫志愿精神如何延续?腾讯的答案是…