SparseArray分析
在寫SparseArray某些情況下比HashMap效能更好,按照官方問答的解釋,主要是因為SparseArray不需要對key和value進行auto-boxing(將原始型別封裝為物件型別,比如把int型別封裝成Integer型別),結構比HashMap簡單(SparseArray內部主要使用兩個一維陣列來儲存資料,一個用來存key,一個用來存value)不需要額外的額外的資料結構
key為int的時候才能使用,注意是int而不是Integer,這也是sparseArray效率提升的一個點,去掉了裝箱的操作
插入
100000條資料的儲存使用DDMS檢視,hashMap的儲存空間14M左右,而SparseArray自由8M多幾乎是少了40%接近
插入時候,SparseArray 正序插入效率比起倒序插入快了幾乎是10倍, hashMap差不多。
我們是按照1,3,2的順序排列的,但是在SparseArray內部還是按照正序排列的,這時因為SparseArray在檢索資料的時候使用的是二分查詢,所以每次插入新資料的時候SparseArray都需要重新排序,所以程式碼4中,逆序是最差情況。
SparseArray原理
單純從字面上來理解,SparseArray指的是稀疏陣列(Sparse array),所謂稀疏陣列就是陣列中大部分的內容值都未被使用(或都為零),在陣列中僅有少部分的空間使用。因此造成記憶體空間的浪費,為了節省記憶體空間,並且不影響陣列中原有的內容值,我們可以採用一種壓縮的方式來表示稀疏陣列的內容。
假設有一個97的陣列,其內容如下
在此陣列中,共有63個空間,但卻只使用了5個元素,造成58個元素空間的浪費。以下我們就使用
其中在稀疏陣列中第一部分所記錄的是原陣列的列數和行數以及元素使用的個數、第二部分所記錄的是原陣列中元素的位置和內容。經過壓縮之後,原來需要宣告大小為63的陣列,而使用壓縮後,只需要宣告大小為63的陣列,僅需18個儲存空間
繼續閱讀SparseArray的原始碼,從構造方法我們可以看出,它和一般的List一樣,可以預先設定容器大小,預設的大小是10:
public SparseArray() {
this(10);
}
注意事項
SparseArray是android裡為<Interger,Object>這樣的Hashmap而專門寫的類,目的是提高記憶體效率,其核心是折半查詢函式(binarySearch)。注意記憶體二字很重要,因為它僅僅提高記憶體效率,而不是提高執行效率,
它只適用於android系統(記憶體對android專案有多重要,地球人都知道)。SparseArray有兩個優點:1.避免了自動裝箱(auto-boxing),2.資料結構不會依賴於外部物件對映。我們知道HashMap 採用一種所謂的“Hash 演算法”來決定每個元素的儲存位置,存放的都是陣列元素的引用,通過每個物件的hash值來對映物件。而SparseArray則是用陣列資料結構來儲存對映,然後通過折半查詢來找到物件。但其實一般來說,SparseArray執行效率比HashMap要慢一點,因為查詢需要折半查詢,而新增刪除則需要在陣列中執行,而HashMap都是通過外部對映。但相對來說影響不大,最主要是SparseArray不需要開闢記憶體空間來額外儲存外部對映,從而節省記憶體
相關文章
- SparseArray原理分析
- SparseArray 原始碼解析原始碼
- 容器類原始碼解析系列(四)---SparseArray分析(最新版)原始碼
- 面試必備:SparseArray原始碼解析面試原始碼
- Android SparseArray 原始碼詳解Android原始碼
- SparseArray詳解及原始碼簡析原始碼
- 安卓效能最佳化—使用ArrayMap與SparseArray安卓
- 資料結構HashMap(Android SparseArray 和ArrayMap)資料結構HashMapAndroid
- 更適合Android的集合 SparseArray/ArrayMap/ArraySetAndroid
- Java&Android 基礎知識梳理(10) - SparseArray 原始碼解析JavaAndroid原始碼
- 後端分析/前端分析/邊緣分析後端前端
- 【漏洞分析】KaoyaSwap 安全事件分析事件
- jemeter分析(二) — jmeter案例分析JMeter
- USB 邏輯分析儀分析丟包怎麼分析(lecroy USB 邏輯分析儀)
- Giraph原始碼分析(六)——Edge 分析原始碼
- 從電影分析到遊戲分析遊戲
- 故障分析 | MySQL死鎖案例分析MySql
- EOS原始碼分析(3)案例分析原始碼
- MyCAT原始碼分析——分析環境部署原始碼
- Excel做分析-相關性分析Excel
- 分析建模-如何識別分析類?
- 分析:應用收費模式分析模式
- 分析建模中的行為分析
- apache kafka原始碼分析-Producer分析ApacheKafka原始碼
- 日誌分析-apache日誌分析Apache
- Unity效能分析(二)CPU/GPU分析UnityGPU
- SWOT分析、PEST分析、GE矩陣、波士屯矩陣等分析方法矩陣
- 資料分析師招聘分析2.0
- Java集合框架分析(五)LinkedHashMap分析Java框架HashMap
- 詞法分析的前奏:字元分析(三)詞法分析字元
- Retrofit原始碼分析三 原始碼分析原始碼
- 二值影象分析之輪廓分析
- Spark原始碼分析之DiskBlockMangaer分析Spark原始碼BloC
- Spark原始碼分析之cahce原理分析Spark原始碼
- Unity效能分析(三)記憶體分析Unity記憶體
- 軟體需求與分析 業務建模分析
- Facebook 分析
- 今日分析