1. 程式人生 > 其它 >【效能優化實戰】Android開發者值得深入思考的幾個問題,神操作!

【效能優化實戰】Android開發者值得深入思考的幾個問題,神操作!

一聲嘆息

從去年9月3號,到今年3月20號,耗時6個月多的找工作經歷終於是畫上圓滿的句號了,近200個日日夜夜的酸甜苦辣想必裸辭的親嘗者都能體會得到,下面想來複盤或者說總結一下這段經歷。但不管怎麼總結,核心還是那一句話:一定要充分的準備!!!

Android面試中有哪些常見問題彙總&答題思路

目錄:

1.網路
2.Java 基礎&容器&同步&設計模式
3.Java 虛擬機器&記憶體結構&GC&類載入&四種引用&動態代理
4.Android 基礎&效能優化&Framwork
5.Android 模組化&熱修復&熱更新&打包&混淆&壓縮
6.音視訊&FFmpeg&播放器

1、網路

網路協議模型

應用層:負責處理特定的應用程式細節
HTTP、FTP、DNS

傳輸層:為兩臺主機提供端到端的基礎通訊
TCP、UDP

網路層:控制分組傳輸、路由選擇等
IP

鏈路層:作業系統裝置驅動程式、網絡卡相關介面

TCP 和 UDP 區別

TCP 連線;可靠;有序;面向位元組流;速度慢;較重量;全雙工;適用於檔案傳輸、瀏覽器等

  • 全雙工:A 給 B 發訊息的同時,B 也能給 A 發
  • 半雙工:A 給 B 發訊息的同時,B 不能給 A 發

UDP 無連線;不可靠;無序;面向報文;速度快;輕量;適用於即時通訊、視訊通話等

TCP 三次握手

A:你能聽到嗎?
B:我能聽到,你能聽到嗎?
A:我能聽到,開始吧

A 和 B 兩方都要能確保:我說的話,你能聽到;你說的話,我能聽到。所以需要三次握手

TCP 四次揮手

A:我說完了
B:我知道了,等一下,我可能還沒說完
B:我也說完了
A:我知道了,結束吧

B 收到 A 結束的訊息後 B 可能還沒說完,沒法立即回覆結束標示,只能等說完後再告訴 A :我說完了。

POST 和 GET 區別

Get 引數放在 url 中;Post 引數放在 request Body 中
Get 可能不安全,因為引數放在 url 中

HTTPS

HTTP 是超文字傳輸協議,明文傳輸;HTTPS 使用 SSL 協議對 HTTP 傳輸資料進行了加密

HTTP 預設 80 埠;HTTPS 預設 443 埠

優點:安全
缺點:費時、SSL 證書收費,加密能力還是有限的,但是比 HTTP 強多了

2、Java 基礎&容器&同步&設計模式

StringBuilder、StringBuffer、+、String.concat 連結字串:

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

Java 泛型擦除

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

ArrayList、LinkedList

ArrayList

基於陣列實現,查詢快:o(1),增刪慢:o(n)
初始容量為10,擴容通過 System.arrayCopy 方法

LinkedList

基於雙向連結串列實現,查詢慢:o(n),增刪快:o(1)
封裝了佇列和棧的呼叫

HashMap 、HashTable

HashMap

  • 基於陣列和連結串列實現,陣列是 HashMap 的主體;連結串列是為解決雜湊衝突而存在的
  • 當發生雜湊衝突且連結串列 size 大於閾值時會擴容,JAVA 8 會將連結串列轉為紅黑樹提高效能
    允許 key/value 為 null

HashTable

  • 資料結構和 HashMap 一樣
  • 不允許 value 為 null
  • 執行緒安全

ArrayMap、SparseArray

ArrayMap

1.基於兩個陣列實現,一個存放 hash;一個存放鍵值對。擴容的時候只需要陣列拷貝,不需要重建雜湊表
2.記憶體利用率高
3.不適合存大量資料,因為會對 key 進行二分法查詢(1000以下)

SparseArray

1.基於兩個陣列實現,int 做 key
2.記憶體利用率高
3.不適合存大量資料,因為會對 key 進行二分法查詢(1000以下)

volatile 關鍵字

  • 只能用來修飾變數,適用修飾可能被多執行緒同時訪問的變數
  • 相當於輕量級的 synchronized,volatitle 能保證有序性(禁用指令重排序)、可見性;後者還能保證原子性
  • 變數位於主記憶體中,每個執行緒還有自己的工作記憶體,變數在自己執行緒的工作記憶體中有份拷貝,執行緒直接操作的是這個拷貝
  • 被 volatile 修飾的變數改變後會立即同步到主記憶體,保持變數的可見性。

雙重檢查單例,為什麼要加 volatile?

1.volatile想要解決的問題是,在另一個執行緒中想要使用instance,發現instance!=null,但是實際上instance還未初始化完畢這個問題

2.將instance =newInstance();拆分為3句話是。1.分配記憶體2.初始化3.將instance指向分配的記憶體空

3.volatile可以禁止指令重排序,確保先執行2,後執行3

wait 和 sleep

  • sleep 是 Thread 的靜態方法,可以在任何地方呼叫
  • wait 是 Object 的成員方法,只能在 synchronized 程式碼塊中呼叫,否則會報 IllegalMonitorStateException 非法監控狀態異常
  • sleep 不會釋放共享資源鎖,wait 會釋放共享資源鎖

lock 和 synchronized

  • synchronized 是 Java 關鍵字,內建特性;Lock 是一個介面
  • synchronized 會自動釋放鎖;lock 需要手動釋放,所以需要寫到 try catch 塊中並在 finally 中釋放鎖
  • synchronized 無法中斷等待鎖;lock 可以中斷
  • Lock 可以提高多個執行緒進行讀/寫操作的效率
  • 競爭資源激烈時,lock 的效能會明顯的優於 synchronized

可重入鎖

  • 定義:已經獲取到鎖後,再次呼叫同步程式碼塊/嘗試獲取鎖時不必重新去申請鎖,可以直接執行相關程式碼
  • ReentrantLock 和 synchronized 都是可重入鎖

公平鎖

  • 定義:等待時間最久的執行緒會優先獲得鎖
  • 非公平鎖無法保證哪個執行緒獲取到鎖,synchronized 就是非公平鎖
  • ReentrantLock 預設時非公平鎖,可以設定為公平鎖

樂觀鎖和悲觀鎖

  • 悲觀鎖:執行緒一旦得到鎖,其他執行緒就掛起等待,適用於寫入操作頻繁的場景;synchronized 就是悲觀鎖
  • 樂觀鎖:假設沒有衝突,不加鎖,更新資料時判斷該資料是否過期,過期的話則不進行資料更新,適用於讀取操作頻繁的場景
  • 樂觀鎖 CAS:Compare And Swap,更新資料時先比較原值是否相等,不相等則表示資料過去,不進行資料更新
  • 樂觀鎖實現:AtomicInteger、AtomicLong、AtomicBoolean

死鎖 4 個必要條件

  • 互斥
  • 佔有且等待
  • 不可搶佔
  • 迴圈等待

synchronized 原理

  • 每個物件都有一個監視器鎖:monitor,同步程式碼塊會執行 monitorenter 開始,motnitorexit 結束
  • wait/notify 就依賴 monitor 監視器,所以在非同步程式碼塊中執行會報 IllegalMonitorStateException 異常

3、Java 虛擬機器&記憶體結構&GC&類載入&四種引用&動態代理

JVM

  • 定義:可以理解成一個虛構的計算機,解釋自己的位元組碼指令集對映到本地 CPU 或 OS 的指令集,上層只需關注 Class 檔案,與作業系統無關,實現跨平臺
  • Kotlin 就是能解釋成 Class 檔案,所以可以跑在 JVM 上

JVM 記憶體模型

  • Java 多執行緒之間是通過共享記憶體來通訊的,每個執行緒都有自己的本地記憶體
  • 共享變數存放於主記憶體中,執行緒會拷貝一份共享變數到本地記憶體
  • volatile 關鍵字就是給記憶體模型服務的,用來保證記憶體可見性和順序性

JVM 記憶體結構

執行緒私有

1.程式計數器:記錄正在執行的位元組碼指令地址,若正在執行 Native 方法則為空
2.虛擬機器棧:執行方法時把方法所需資料存為一個棧幀入棧,執行完後出棧
3.本地方法棧:同虛擬機器棧,但是針對的是 Native 方法

執行緒共享

1.堆:儲存 Java 例項,GC 主要區域,分代收集 GC 方法會吧堆劃分為新生代、老年代
2.方法區:儲存類資訊,常量池,靜態變數等資料

GC

回收區域:只針對堆、方法區;執行緒私有區域資料會隨執行緒結束銷燬,不用回收

總結

演算法知識點繁多,企業考察的題目千變萬化,面對越來越近的“金九銀十”,我給大家準備好了一套比較完善的學習方法,希望能幫助大家在有限的時間裡儘可能系統快速的惡補演算法,通過高效的學習來提高大家面試中演算法模組的通過率。

這一套學習資料既有文字檔也有視訊,裡面不僅僅有關鍵知識點的整理,還有案例的演算法相關部分的講解,可以幫助大家更好更全面的進行學習,二者搭配起來學習效果會更好。

部分資料展示:




有了這套學習資料,堅持刷題一週,你就會發現自己的演算法知識體系有明顯的完善,離大廠Offer的距離更加近。

資料獲取方法:點贊+關注+轉發,然後進入我的【Gitee】,裡面有免費獲取途徑