1. 程式人生 > >Android——效能優化之SparseArray

Android——效能優化之SparseArray

相信大家都用過HashMap用來存放鍵值對,最近在專案中使用HashMap的時候發現,有時候 IDE 會提示我這裡的HashMap可以用SparseArray或者SparseIntArray等等來代替。

SparseArray(稀疏陣列).它是Android內部特有的api,標準的jdk是沒有這個類的.在Android內部用來替代HashMap<Integer,E>這種形式,使用SparseArray更加節省記憶體空間的使用,SparseArray也是以key和value對資料進行儲存的.使用的時候只需要指定value的型別即可.並且key不需要封裝成物件型別.

首先是建立:

SparseArray<Student> sparseArray = new SparseArray<>();
SparseArray<Student> sparseArray = new SparseArray<>(capacity);//這裡是可以指定長度的

插入:

sparseArray.put(int key,Student value);// 這裡SparseArray存放的鍵值對中的鍵是int型的資料

獲取:

sparseArray.get(int key);
sparseArray.get(int key,Student valueIfNotFound);

刪除:

sparseArray.remove(int key);// 通過int型別的鍵刪除指定的值

index:

因為是可以替代HashMap的,前面的方法和其沒有太大區別。而這個index就是SparseArray所特有的屬性了,SparseArray從名字上看就能猜到跟陣列有關係,事實上他底層是兩條陣列,一組存放key,一組存放value,知道了這一點應該能猜到index的作用了...

sparseArray.indexOfKey(int key);
sparseArray.indexOfValue(T value);
sparseArray.keyAt(int index);
sparseArray.valueAt(int index);
sparseArray.setValueAt(int index);
sparseArray.removeAt(int index);
sparseArray.removeAt(int index,int size);

注:通過對SparseArray[index]底層原始碼的分析---SparseArray每次的插入方式都需要呼叫二分查詢.因此這樣在倒序插入的時候會導致情況非常的糟糕,效率上絕對輸給了HashMap學過資料結構的大家都知道.Map在插入的時候會對衝突因子做出相應的決策.有非常好的處理衝突的方式.不需要遍歷每一個值.因此無論是倒序還是正序插入的效率取決於處理衝突的方式,因此插入時犧牲的時間基本是相同的.