Android中SparseArray解析

   SparseArray

     在Android爲替代HashMap而產生的,SparseArray是Android裏爲<Interger,Object>這樣的Hashmap而專門寫的類,目的是提高內存效率,其核心是折半查找函數(binarySearch)。注意內存二字很重要,因爲它僅僅提高內存效率,而不是提高執行效率,所以也決定它只適用於Android系統(內存對android項目有多重要,地球人都知道)。SparseArray有兩個優點:1.避免了自動裝箱(auto-boxing),2.數據結構不會依賴於外部對象映射。我們知道HashMap 採用一種所謂的“Hash 算法”來決定每個元素的存儲位置,存放的都是數組元素的引用,通過每個對象的hash值來映射對象。而SparseArray則是用數組數據結構來保存映射,然後通過折半查找來找到對象。但其實一般來說,SparseArray執行效率比HashMap要慢一點,因爲查找需要折半查找,而添加刪除則需要在數組中執行,而HashMap都是通過外部映射。但相對來說影響不大,最主要是SparseArray不需要開闢內存空間來額外存儲外部映射,從而節省內存。

   看看源碼中SparseArray中的方法:

 

     對於修改數據起初以爲只有setValueAt(int index, E value)可以修改數據,但後來發現put(int key, E value)也可以修改數據,我們查看put(int key, E value)的源碼可知,在put數據之前,會先查找要put的數據是否已經存在,如果存在就是修改,不存在就添加,這倒是感覺跟HashMap很像。

    其中get(int key)也只是調用了 get(int key,E valueIfKeyNotFound),最後一個從傳參的變量名就能看出,傳入的是找不到的時候返回的值.get(int key)當找不到的時候,默認返回null

    對應valueAt(int)方法,查看鍵所在位置,由於是採用二分法查找鍵的位置,所以找不到時返回小於0的數值,而不是返回-1。返回的負值是表示它在找不到時所在的位置

    發現其核心就是折半查找函數(binarySearch),~\(≧▽≦)/~贊:


   

    相應的也有SparseBooleanArray,用來取代HashMap<Integer, Boolean>,SparseIntArray用來取代HashMap<Integer, Integer>

    具體感興趣可以繼續深入瞭解...

發佈了53 篇原創文章 · 獲贊 8 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章