安卓优化之SparseArray易懂详解

SparseArray是对HashMap<Integer, E>的内存优化。

它怎么优化的呢,为什么说这个呢。因为知道怎么优化的之后,我们就能更好的理解它的方法和使用它。下面我们来说最能看出它优化的遍历。

遍历

//可以看到有从零到Size的index。
for (int i = 0; i < sparseArray.size(); i++) {
     int key = keyAt(i);
     Object value = valueAt(i);
   }

可以看到它有点像ArrayList,其实内存优化在于SparseArray是单纯数组的结合.被称为稀疏数组,对数据保存不会有额外的开销。那它的排序也像Arraylist一样按放入的时间排序吗。当然不该是这样了,你别忘了它还有个int值的Key。

SparseArray增删改查

SparseArray有三个元素:index,key,value。index从零到size。key_value键值对按key从小到大顺序排入index里。理解了这个就好看下面的api了。

增和改

它是按key排序的,所以每次赋值(key存在时更改,key不存在时新增)都要找到插入位置,我们来看两种赋值方法,也是让人比较迷的地方:

public void put(int key, E value);
public void append(int key, E value)   

这种append方式跟put有啥区别呢,append官方是这样说的:
Puts a key/value pair into the array,optimizing for the case where the key is greater than all existing keys in the array.
啥意思呢,其实append就是个优化。因为插入时使用的是二分查找。用append就是如果key比以前所有的key都大(其实只比较最后一个),直接放后面,就不用二分查找了。

public void delete(int key)  
public void remove(int key) //同delete
public void removeAt(int index) //越界不报错
public void clear()

public E get(int key)  //没有为null
public E get(int key, E valueIfKeyNotFound) 
public int keyAt(int index) //越界为0,这个要注意。所以设key最好不要有0
public E valueAt(int index)  //越界为null
public int indexOfKey(int key)  //如果没有返回负数
public int indexOfValue(E value) //如果没有返回负数

直接改value

public void setValueAt(int index, E value) //越界不报错

猜你喜欢

转载自blog.csdn.net/wanyouzhi/article/details/78489270
今日推荐