面试加分项!程序员工作2年月薪12K,附架构师必备技术详解
最近看到群里看到一個女生,講述了她從開始選擇Android,經(jīng)過非常努力的學習和掙扎,然而最后面對當前的環(huán)境卻不得不放棄。看完以后真的非常替她感覺惋惜,如果早幾年入行可能結(jié)果會比現(xiàn)在好很多,但可惜,這就是現(xiàn)實。
這是一個做精品的時代了,不是當年出個產(chǎn)品就能拉投資騙點擊的時代了。精品需要的是更專業(yè)的人才,也就是對APP開發(fā)人員的素質(zhì)要求會更高,這個市場會回歸一個正常的節(jié)奏,拿多少錢就是看能力,看產(chǎn)品。
Android面試中有哪些常見問題匯總&答題思路
目錄:
1.網(wǎng)絡(luò)
2.Java 基礎(chǔ)&容器&同步&設(shè)計模式
3.Java 虛擬機&內(nèi)存結(jié)構(gòu)&GC&類加載&四種引用&動態(tài)代理
4.Android 基礎(chǔ)&性能優(yōu)化&Framwork
5.Android 模塊化&熱修復&熱更新&打包&混淆&壓縮
6.音視頻&FFmpeg&播放器
1、網(wǎng)絡(luò)
網(wǎng)絡(luò)協(xié)議模型
應用層:負責處理特定的應用程序細節(jié)
HTTP、FTP、DNS
傳輸層:為兩臺主機提供端到端的基礎(chǔ)通信
TCP、UDP
網(wǎng)絡(luò)層:控制分組傳輸、路由選擇等
IP
鏈路層:操作系統(tǒng)設(shè)備驅(qū)動程序、網(wǎng)卡相關(guān)接口
TCP 和 UDP 區(qū)別
TCP 連接;可靠;有序;面向字節(jié)流;速度慢;較重量;全雙工;適用于文件傳輸、瀏覽器等
- 全雙工:A 給 B 發(fā)消息的同時,B 也能給 A 發(fā)
- 半雙工:A 給 B 發(fā)消息的同時,B 不能給 A 發(fā)
UDP 無連接;不可靠;無序;面向報文;速度快;輕量;適用于即時通訊、視頻通話等
TCP 三次握手
A:你能聽到嗎?
B:我能聽到,你能聽到嗎?
A:我能聽到,開始吧
A 和 B 兩方都要能確保:我說的話,你能聽到;你說的話,我能聽到。所以需要三次握手
TCP 四次揮手
A:我說完了
B:我知道了,等一下,我可能還沒說完
B:我也說完了
A:我知道了,結(jié)束吧
B 收到 A 結(jié)束的消息后 B 可能還沒說完,沒法立即回復結(jié)束標示,只能等說完后再告訴 A :我說完了。
POST 和 GET 區(qū)別
Get 參數(shù)放在 url 中;Post 參數(shù)放在 request Body 中
Get 可能不安全,因為參數(shù)放在 url 中
HTTPS
HTTP 是超文本傳輸協(xié)議,明文傳輸;HTTPS 使用 SSL 協(xié)議對 HTTP 傳輸數(shù)據(jù)進行了加密
HTTP 默認 80 端口;HTTPS 默認 443 端口
優(yōu)點:安全
缺點:費時、SSL 證書收費,加密能力還是有限的,但是比 HTTP 強多了
2、Java 基礎(chǔ)&容器&同步&設(shè)計模式
StringBuilder、StringBuffer、+、String.concat 鏈接字符串:
- StringBuffer 線程安全,StringBuilder 線程不安全
- +實際上是用 StringBuilder 來實現(xiàn)的,所以非循環(huán)體可以直接用 +,循環(huán)體不行,因為會頻繁創(chuàng)建 StringBuilder
- String.concat 實質(zhì)是 new String ,效率也低,耗時排序:StringBuilder < StringBuffer < concat < +
Java 泛型擦除
- 修飾成員變量等類結(jié)構(gòu)相關(guān)的泛型不會被擦除
- 容器類泛型會被擦除
ArrayList、LinkedList
ArrayList
基于數(shù)組實現(xiàn),查找快:o(1),增刪慢:o(n)
初始容量為10,擴容通過 System.arrayCopy 方法
LinkedList
基于雙向鏈表實現(xiàn),查找慢:o(n),增刪快:o(1)
封裝了隊列和棧的調(diào)用
HashMap 、HashTable
HashMap
- 基于數(shù)組和鏈表實現(xiàn),數(shù)組是 HashMap 的主體;鏈表是為解決哈希沖突而存在的
- 當發(fā)生哈希沖突且鏈表 size 大于閾值時會擴容,JAVA 8 會將鏈表轉(zhuǎn)為紅黑樹提高性能
允許 key/value 為 null
HashTable
- 數(shù)據(jù)結(jié)構(gòu)和 HashMap 一樣
- 不允許 value 為 null
- 線程安全
ArrayMap、SparseArray
ArrayMap
1.基于兩個數(shù)組實現(xiàn),一個存放 hash;一個存放鍵值對。擴容的時候只需要數(shù)組拷貝,不需要重建哈希表
2.內(nèi)存利用率高
3.不適合存大量數(shù)據(jù),因為會對 key 進行二分法查找(1000以下)
SparseArray
1.基于兩個數(shù)組實現(xiàn),int 做 key
2.內(nèi)存利用率高
3.不適合存大量數(shù)據(jù),因為會對 key 進行二分法查找(1000以下)
volatile 關(guān)鍵字
- 只能用來修飾變量,適用修飾可能被多線程同時訪問的變量
- 相當于輕量級的 synchronized,volatitle 能保證有序性(禁用指令重排序)、可見性;后者還能保證原子性
- 變量位于主內(nèi)存中,每個線程還有自己的工作內(nèi)存,變量在自己線程的工作內(nèi)存中有份拷貝,線程直接操作的是這個拷貝
- 被 volatile 修飾的變量改變后會立即同步到主內(nèi)存,保持變量的可見性。
雙重檢查單例,為什么要加 volatile?
1.volatile想要解決的問題是,在另一個線程中想要使用instance,發(fā)現(xiàn)instance!=null,但是實際上instance還未初始化完畢這個問題
2.將instance =newInstance();拆分為3句話是。1.分配內(nèi)存2.初始化3.將instance指向分配的內(nèi)存空
3.volatile可以禁止指令重排序,確保先執(zhí)行2,后執(zhí)行3
wait 和 sleep
- sleep 是 Thread 的靜態(tài)方法,可以在任何地方調(diào)用
- wait 是 Object 的成員方法,只能在 synchronized 代碼塊中調(diào)用,否則會報 IllegalMonitorStateException 非法監(jiān)控狀態(tài)異常
- sleep 不會釋放共享資源鎖,wait 會釋放共享資源鎖
lock 和 synchronized
- synchronized 是 Java 關(guān)鍵字,內(nèi)置特性;Lock 是一個接口
- synchronized 會自動釋放鎖;lock 需要手動釋放,所以需要寫到 try catch 塊中并在 finally 中釋放鎖
- synchronized 無法中斷等待鎖;lock 可以中斷
- Lock 可以提高多個線程進行讀/寫操作的效率
- 競爭資源激烈時,lock 的性能會明顯的優(yōu)于 synchronized
可重入鎖
- 定義:已經(jīng)獲取到鎖后,再次調(diào)用同步代碼塊/嘗試獲取鎖時不必重新去申請鎖,可以直接執(zhí)行相關(guān)代碼
- ReentrantLock 和 synchronized 都是可重入鎖
公平鎖
- 定義:等待時間最久的線程會優(yōu)先獲得鎖
- 非公平鎖無法保證哪個線程獲取到鎖,synchronized 就是非公平鎖
- ReentrantLock 默認時非公平鎖,可以設(shè)置為公平鎖
樂觀鎖和悲觀鎖
- 悲觀鎖:線程一旦得到鎖,其他線程就掛起等待,適用于寫入操作頻繁的場景;synchronized 就是悲觀鎖
- 樂觀鎖:假設(shè)沒有沖突,不加鎖,更新數(shù)據(jù)時判斷該數(shù)據(jù)是否過期,過期的話則不進行數(shù)據(jù)更新,適用于讀取操作頻繁的場景
- 樂觀鎖 CAS:Compare And Swap,更新數(shù)據(jù)時先比較原值是否相等,不相等則表示數(shù)據(jù)過去,不進行數(shù)據(jù)更新
- 樂觀鎖實現(xiàn):AtomicInteger、AtomicLong、AtomicBoolean
死鎖 4 個必要條件
- 互斥
- 占有且等待
- 不可搶占
- 循環(huán)等待
synchronized 原理
- 每個對象都有一個監(jiān)視器鎖:monitor,同步代碼塊會執(zhí)行 monitorenter 開始,motnitorexit 結(jié)束
- wait/notify 就依賴 monitor 監(jiān)視器,所以在非同步代碼塊中執(zhí)行會報 IllegalMonitorStateException 異常
3、Java 虛擬機&內(nèi)存結(jié)構(gòu)&GC&類加載&四種引用&動態(tài)代理
JVM
- 定義:可以理解成一個虛構(gòu)的計算機,解釋自己的字節(jié)碼指令集映射到本地 CPU 或 OS 的指令集,上層只需關(guān)注 Class 文件,與操作系統(tǒng)無關(guān),實現(xiàn)跨平臺
- Kotlin 就是能解釋成 Class 文件,所以可以跑在 JVM 上
JVM 內(nèi)存模型
- Java 多線程之間是通過共享內(nèi)存來通信的,每個線程都有自己的本地內(nèi)存
- 共享變量存放于主內(nèi)存中,線程會拷貝一份共享變量到本地內(nèi)存
- volatile 關(guān)鍵字就是給內(nèi)存模型服務的,用來保證內(nèi)存可見性和順序性
JVM 內(nèi)存結(jié)構(gòu)
線程私有:
1.程序計數(shù)器:記錄正在執(zhí)行的字節(jié)碼指令地址,若正在執(zhí)行 Native 方法則為空
2.虛擬機棧:執(zhí)行方法時把方法所需數(shù)據(jù)存為一個棧幀入棧,執(zhí)行完后出棧
3.本地方法棧:同虛擬機棧,但是針對的是 Native 方法
線程共享:
1.堆:存儲 Java 實例,GC 主要區(qū)域,分代收集 GC 方法會吧堆劃分為新生代、老年代
2.方法區(qū):存儲類信息,常量池,靜態(tài)變量等數(shù)據(jù)
GC
回收區(qū)域:只針對堆、方法區(qū);線程私有區(qū)域數(shù)據(jù)會隨線程結(jié)束銷毀,不用回收
總結(jié)
Android架構(gòu)學習進階是一條漫長而艱苦的道路,不能靠一時激情,更不是熬幾天幾夜就能學好的,必須養(yǎng)成平時努力學習的習慣。所以:貴在堅持!
上面分享的字節(jié)跳動公司2021年的面試真題解析大全,筆者還把一線互聯(lián)網(wǎng)企業(yè)主流面試技術(shù)要點整理成了視頻和PDF(實際上比預期多花了不少精力),包含知識脈絡(luò) + 諸多細節(jié)。
【Android學習PDF+學習視頻+面試文檔+知識點筆記】
【Android高級架構(gòu)視頻學習資源】
公司2021年的面試真題解析大全,筆者還把一線互聯(lián)網(wǎng)企業(yè)主流面試技術(shù)要點整理成了視頻和PDF(實際上比預期多花了不少精力),包含知識脈絡(luò) + 諸多細節(jié)。
[外鏈圖片轉(zhuǎn)存中…(img-RWPbsVPn-1618646800688)]
【Android學習PDF+學習視頻+面試文檔+知識點筆記】
【Android高級架構(gòu)視頻學習資源】
Android部分精講視頻領(lǐng)取學習后更加是如虎添翼!進軍BATJ大廠等(備戰(zhàn))!現(xiàn)在都說互聯(lián)網(wǎng)寒冬,其實無非就是你上錯了車,且穿的少(技能),要是你上對車,自身技術(shù)能力夠強,公司換掉的代價大,怎么可能會被裁掉,都是淘汰末端的業(yè)務Curd而已!現(xiàn)如今市場上初級程序員泛濫,這套教程針對Android開發(fā)工程師1-6年的人員、正處于瓶頸期,想要年后突破自己漲薪的,進階Android中高級、架構(gòu)師對你更是如魚得水,趕快領(lǐng)取吧!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的面试加分项!程序员工作2年月薪12K,附架构师必备技术详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多囊卵巢综合症熬夜会怎么样
- 下一篇: 英雄联盟死亡颂唱者怎么样?