SparseArray<E> 是官方推荐的用来替代 HashMap<Integer, E> 的一个工具类,相比来说有着更好的性能(其核心是折半查找函数(binarySearch))。
通过源码来看下SparseArray<E>的一些使用特点:
-------------------------------------------------------------------------------------------------------
1、SparseArray可以预先设置容器大小,默认是10
/** * Creates a new SparseArray containing no mappings. */ public SparseArray() { this(10); }
-------------------------------------------------------------------------------------------------------
2、增删改查
(1)两种添加数据的方法
public void put(int key, E value) public void append(int key, E value)
其中append()内部调用了put()
put()内部又使用了二分法存储数据,由此可见:它存储的数值都是按键值从小到大的顺序排列好的
static int binarySearch(int[] array, int size, int value) { int lo = 0; int hi = size - 1; while (lo <= hi) { final int mid = (lo + hi) >>> 1; final int midVal = array[mid]; if (midVal < value) { lo = mid + 1; } else if (midVal > value) { hi = mid - 1; } else { return mid; // value found } } return ~lo; // value not present }
(2)四种删除数据的方法
--前两种
public void delete(int key) public void remove(int key)
两者作用是相同的,没区别,因为remove()内部就直接调用了delete()
/** * Alias for {@link #delete(int)}. */ public void remove(int key) { delete(key); }
--后两种
public void removeAt(int index) public void clear()
一个是删除指定坐标的数据
一个是清空所有的数据
(3)两种修改数据的方法
public void setValueAt(int index, E value) public void put(int key, E value)
这里put()方法可能会有疑惑,它不是添加数据的么,怎么也可以修改数据了?
看下put()部分源码:
int i = ContainerHelpers.binarySearch(mKeys, mSize, key); if (i >= 0) { mValues[i] = value; } else {
先是查找这个key是不是存在,返回一个整型,如果i>=0,说明存在,直接修改值 ,否则执行else()添加数据
(4)查询获取数据的方法
--获取键对应的值
public E get(int key) public E get(int key, E valueIfKeyNotFound)
很简单,获取某个键对应的值,两个参数的方法的第二个参数当然就是没有这个key键,返回的默认值
--根据坐标获取该位置的键
public int keyAt(int index)
--根据坐标获取该位置的值
public E valueAt(int index)
----------------------------------------------
--查看键所在的位置
public int indexOfKey(int key)
--查看值所在的位置
public int indexOfValue(E value)
这两个方法返回一个整型数值,往常来说,返回-1代表不存在。
但是这两个方法返回的值不确定,但查询不到的话返回的值还是一个负数。判断是否小于0即可
-------------------------------------------------------------------------------------------------------
相关知识: