大厂Offer拿到手软啊!技术详细介绍
面試了一位工作12年的程序員,
這位老哥有3年java開發(fā)經(jīng)驗(yàn),2年H5,7年Android開發(fā)經(jīng)驗(yàn),簡(jiǎn)歷上寫著精通Java,Android,熟悉H5開發(fā)。沒有具體的技術(shù)點(diǎn)。
說實(shí)話我很期待這位老哥的面試,于是讓人事邀約了他。
老哥面試的氣場(chǎng)很足,我也很尊敬他,一大波的自我介紹之后,我們進(jìn)入了正題。
我問了他Jetpack,他說幾乎沒用過Jetpack,于是我給他舉了個(gè)小例子,老哥給我的答案是百度可以解決。
于是我又問了他Groovy,老哥還是說不清楚,于是我問了最基礎(chǔ)的Handler,Binder等幾個(gè)關(guān)鍵詞,依舊說不清楚,老哥依舊那么強(qiáng)勢(shì)霸氣,他給到我的感覺就是“啥都會(huì)做,你別問這些沒用的”。
看著他簡(jiǎn)歷上寫著,精通安卓開發(fā),熟悉跨平臺(tái)開發(fā),js交互,我問了一句了解Flutter嗎?他說不知道沒聽過,最后問了一句期望薪資他說25k,我不知道問什么了,于是匆匆結(jié)束了面試。
網(wǎng)絡(luò):分層模型、TCP、UDP、HTTP、HTTPS
分層模型
- 應(yīng)用層:負(fù)責(zé)處理特定的應(yīng)用程序細(xì)節(jié),如 HTTP、FTP、DNS
- 運(yùn)輸層:為兩臺(tái)主機(jī)提供端到端的基礎(chǔ)通信,如 TCP、UDP
- 網(wǎng)絡(luò)層:控制分組傳輸、路由選擇等,如 IP
- 鏈路層:操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序、網(wǎng)卡相關(guān)接口
UDP
- UDP 頭結(jié)構(gòu):來源端口、目的端口、長(zhǎng)度域、校驗(yàn)和
- 特點(diǎn):不可靠、無序、面向報(bào)文、速度快、輕量
- 適用場(chǎng)景:適用于即時(shí)通訊、視頻通話等
- 應(yīng)用:DHCP、DNS、QUCI、VXLAN、GTP-U、TFTP、SNMP
TCP
- TCP 頭結(jié)構(gòu):來源端口、目的端口、序號(hào)、確認(rèn)序號(hào)、SYN/ACK 等狀態(tài)位、窗口大小、校驗(yàn)和、緊急指針
- 特點(diǎn):面向字節(jié)流、有擁塞和流量控制、可靠、有序、速度慢、較重量,通過滑動(dòng)窗口實(shí)現(xiàn)流量控制、用塞控制
- 適用場(chǎng)景:文件傳輸、瀏覽器等
- 應(yīng)用:HTTP、HTTPS、RTMP、FTP、SMTP、POP3
- 三次握手:
- 四次揮手:
HTTP
- 超文本傳輸協(xié)議,明文傳輸,默認(rèn) 80 端口
- POST 和 GET:Get 參數(shù)放在 url 中;Post 參數(shù)放在 request Body 中
- 訪問網(wǎng)頁(yè)過程:DNS 域名解析、TCP 三次握手建立連接、發(fā)起 HTTP 請(qǐng)求
HTTPS
- 默認(rèn) 443 端口,使用 SSL 協(xié)議對(duì) HTTP 傳輸數(shù)據(jù)進(jìn)行了加密,安全
- 加密過程:Client/Server 通過非對(duì)稱加密生成密鑰,然后用這個(gè)密鑰去對(duì)稱加密傳輸數(shù)據(jù)
算法:數(shù)據(jù)結(jié)構(gòu)、常用算法
數(shù)據(jù)結(jié)構(gòu)
- 數(shù)組、鏈表
- 棧、隊(duì)列
- 散列表
- 樹、堆、圖
常用算法
- 排序
- 雙指針、滑動(dòng)窗口、字符串
- 遞歸、分治、二分
- 回溯、貪心、動(dòng)態(tài)規(guī)劃
Java 基礎(chǔ):StringBuilder、泛型擦除、Exception、IO、容器
StringBuilder
- StringBuffer 線程安全,StringBuilder 線程不安全
- +實(shí)際上是用 StringBuilder 來實(shí)現(xiàn)的,所以非循環(huán)體可以直接用 +,循環(huán)體不行,因?yàn)闀?huì)頻繁創(chuàng)建 StringBuilder
- String.concat 實(shí)質(zhì)是 new String ,效率也低,耗時(shí)排序:StringBuilder < StringBuffer < concat < +
泛型擦除
- 修飾成員變量等類結(jié)構(gòu)相關(guān)的泛型不會(huì)被擦除
- 容器類泛型會(huì)被擦除
Exception 和 Error
- Exception 和 Error 都繼承自 Throwable
- Error 大部分是指不可恢復(fù)的錯(cuò)誤狀態(tài),比如 OOM,所以也不需要捕獲
- Exception 分為 CheckedException 和 UnCheckedException
- CheckedException:必須顯式捕獲,受編譯器檢查,比如 io 操作
- UnCheckedException:不用顯示捕獲,比如空指針、數(shù)組越界等
IO 、 NIO、 OKIO
- IO 是面向流的,一次一個(gè)字節(jié)的處理,NIO 是面向緩沖區(qū)的,一次產(chǎn)生或消費(fèi)一個(gè)數(shù)據(jù)塊
- IO 是阻塞的,NIO 是非阻塞的
- NIO 支持內(nèi)存映射方式
- okio 相比 io 和 nio,api 更簡(jiǎn)單易用
- okio 支持超時(shí)機(jī)制
- okio 引入 ByteString 空間換時(shí)間提高性能
- okio 采用 segment 機(jī)制進(jìn)行內(nèi)存共享,節(jié)省 copy 時(shí)間消耗
ArrayList、LinkedList
- ArrayList
- 基于數(shù)組實(shí)現(xiàn),查找快:o(1),增刪慢:o(n)
- 初始容量為10,擴(kuò)容通過 System.arrayCopy 方法
- LinkedList
- 基于雙向鏈表實(shí)現(xiàn),查找慢:o(n),增刪快:o(1)
- 封裝了隊(duì)列和棧的調(diào)用
HashMap 、HashTable、HashSet
-
HashMap(允許 key/value 為 null)
- 基于數(shù)組和單向鏈表實(shí)現(xiàn),數(shù)組是 HashMap 的主體;鏈表是為解決哈希沖突而存在的,存放的是key和value結(jié)合的實(shí)體
- 數(shù)組索引通過 key.hashCode(還會(huì)二次 hash) 得到,在鏈表上通過 key.equals 索引
- 哈希沖突落在同一個(gè)桶中時(shí),直接放在鏈表頭部(java1.8后放到尾部)
- JAVA 8 中鏈表數(shù)量大于 8 時(shí)會(huì)轉(zhuǎn)為紅黑樹存儲(chǔ),查找時(shí)間由 O(n) 變?yōu)?O(logn)
- 數(shù)組長(zhǎng)度總是2的n次方:這樣就能通過位運(yùn)算實(shí)現(xiàn)取余,從而讓 index 能落在數(shù)組長(zhǎng)度范圍內(nèi)
- 加載因子(默認(rèn)0.75)表示添加到多少填充比時(shí)進(jìn)行擴(kuò)容,填充比大:鏈表較長(zhǎng),查找慢;填充比小:鏈表短,查找快
- 擴(kuò)容時(shí)直接創(chuàng)建原數(shù)組兩倍的長(zhǎng)度,然后將原有對(duì)象再進(jìn)行hash找到新的index,重新放
-
HashTable(不允許 key/value 為 null)
- 數(shù)據(jù)結(jié)構(gòu)和 HashMap 一樣
- 線程安全
-
HashSet
- 基于 HashMap 實(shí)現(xiàn),元素就是 HashMap 的 key,Value 傳入了一個(gè)固定值
ArrayMap、SparseArray
-
ArrayMap
- 基于兩個(gè)數(shù)組實(shí)現(xiàn),一個(gè)存放 hash;一個(gè)存放鍵值對(duì)
- 存放 hash 的數(shù)組是有序的,查找時(shí)使用二分法查找
- 發(fā)生哈希沖突時(shí)鍵值對(duì)數(shù)組里連續(xù)存放,查找時(shí)也是通過 key.equals索引,找不到時(shí)先向后再向前遍歷相同hash值的鍵值對(duì)數(shù)組
- 擴(kuò)容時(shí)不像 HashMap 直接 double,內(nèi)存利用率高;也不需要重建哈希表,只需要調(diào)用 system.arraycopy 數(shù)組拷貝,性能較高
- 不適合存大量數(shù)據(jù)(1000以下),因?yàn)閿?shù)據(jù)量大的時(shí)候二分查找相比紅黑樹會(huì)慢很多
-
SparseArray
- 基于 ArrayMap,key 只能是特定類型
Concurrent 集合
- ConcurrentHashMap
- 數(shù)據(jù)結(jié)構(gòu)跟 HashMap 一樣,還是數(shù)組加鏈表
- 采用 segment 分段鎖技術(shù),不像 HashTable 無腦直接同步 put 和 get 操作
- get 操作沒有加鎖,因?yàn)?value 用 volatile 修飾來保證可見行,性能很高
- java1.8 后去除分段鎖,采用 CAS 樂觀鎖加 synchronized 來實(shí)現(xiàn)
LRUCache 原理
- 基于訪問順序排序的 LinkedHashMap 實(shí)現(xiàn),最近訪問的會(huì)排在最后
最后
愿你有一天,真愛自己,善待自己。
本文在開源項(xiàng)目:Android開發(fā)不會(huì)這些?如何面試拿高薪?中已收錄,里面包含不同方向的自學(xué)編程路線、面試題集合/面經(jīng)、及系列技術(shù)文章等,資源持續(xù)更新中…
總結(jié)
以上是生活随笔為你收集整理的大厂Offer拿到手软啊!技术详细介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 条形码编程实例
- 下一篇: 科技战疫志愿精神如何延续?腾讯的答案是…