SparseArray
SparseArray比HashMap 更省内存。
在千级以下的数据处理中,比HashMap的性能更好,因为它避免了对key的自动装箱(int转为Integer类型),同时采取了压缩方式来表示稀疏的数组数据。
SparseArray 的内部采用两个数组来维持key 和 value
private int[] mKeys;
private Object[] mValues;
SparseArray 的key只能为int类型,value 为Object类型。
在数据存储和查找时,使用的是二分查找。
public void put(int key, E value) {
int i = ContainerHelpers.binarySearch(mKeys, mSize, key);
...
}
public E get(int key, E valueIfKeyNotFound) {
int i = ContainerHelpers.binarySearch(mKeys, mSize, key);
...
}
put 数据的时候,通过使用二分查找key的大小,按照大小顺序排列,所以,SparseArray存储的元素都是按元素的key值从小到大排列好的。
get 数据的时候,也是通过二分查找,来判断元素的位置,所以在千级的数据量中就远比HashMap通过比遍历Entry[]数组要快的多。
添加数据
public void put(int key, E value)
获取数据
public E get(int key)
public E get(int key, E valueIfKeyNotFound)
//第二个方法相比与第一个方法,可以设置在key不存在的情况下返回一个默认值
删除数据
public void remove(int key)
public void delete(int key)
// 其实最终调用的是delete方法
特有方法
//通过indx获取key
public int keyAt(int index)
//通过indx获取value
public E valueAt(int index)
关于SparseArray的使用场景
- 数据量比较小的情况下,千量级别。
- key为int类型。(如果key为Long类型,还有一个LongSparseArray)
- 如果数据量很大,SparseArray的性能 最低不低于HashMap的50%,酌情选择。
官方文档
The implementation is not intended to be appropriate for data structures that
may contain large numbers of items. It is generally slower than a traditional
HashMap, since lookups require a binary search and adds and removes require
inserting and deleting entries in the array. For containers holding up to
hundreds of items, the performance difference is not significant, less than50%.
ArrayMap
关于ArrayMap,它是是一个
private Object[] mKeys;
private Object[] mValues;
添加数据
public V put(K key, V value)
获取数据
public V get(Object key)
删除数据
public V remove(Object key)
特有方法
public K keyAt(int index)
public V valueAt(int index)
以上都只支持到API19版本,如果想向下兼容,导入V4包即可
android.support.v4.util.ArrayMap;