1. 程式人生 > >android獨有的省記憶體的輕量級容器類

android獨有的省記憶體的輕量級容器類

在android中, 如果可能, 請優先考慮SparseArray族(稀疏陣列)代替HashMap:
SparseArray HashMap<Integer, Object>
SparseBooleanArray HashMap<Integer, Boolean>
SparseIntArray HashMap<Integer, Integer>
SparseLongArray HashMap<Integer, Long>
給出的優點: 比HashMap省很多記憶體; 沒有裝箱拆箱; 與equals()和hashCode()無關; 對於小容量情況(小於1000), 速度與HashMap相差不大;
不過可能的缺點: 不工作在非android專案上; 速度比HashMap慢(SparseArray使用兩個陣列, 其新增、查詢、刪除資料都需要先進行一次二分查詢), 不適合大容量的情況; 當然你也可以嘗試trove.jar;


在android中, 如果可能, 請優先考慮ArrayMap/ArraySet代替HashMap/HashSet:
1. ArraySet不是由ArrayMap實現(HashSet是由HashMap實現), 整體上ArraySet/ArrayMap比HashSet/HashMap輕量級的多;
2. 將Key的hash存在一個int[]數組裡, 表明Key的唯一性, 而不是用作hash查詢演算法, 將Key/Value都存在Object[]型別的數組裡, 如果Key存在索引i上, 則Value存在i+1的位置上, 使用二分查詢在int[]中找到對應hash所在的index, 然後由index對映到對應Object[]的某個索引位置, 進而得到Key/Value;
3. 為了KeySet, 有必要在Object[]中儲存Key;
4. ArrayMap/ArraySet會更積極地控制底層陣列的大小增長, 因為它只要求複製陣列條目, 而不是像HashMap/HashSet那樣重建一個雜湊對映;
5. 和SparseArray族一樣, 比HashMap/HashSet更省記憶體, 但在大容量情況, 速度比HashMap/HashSet慢, 其中一個原因是為了節省記憶體, ArrayMap/ArraySet可能在刪除操作時, 壓縮底層陣列, HashMap/HashSet取勝的另一個關鍵是hash查詢演算法比二分查詢高效, 但前提是一個好的hash演算法函式和一個大的容器空間以減少hash碰撞;
6. 如果你不需要Java類庫裡的標準容器API(比如迭代器等), 可以考慮使用支援庫裡的SimpleArrayMap, 後者沒有實現java.util.Map介面;


注: 對於大容量的情況, 請務必關注構造器capacity的設定, 它對效能的影響至關重要;