SparseArray是android.util包中一个用于映射int和对象的数据结构,内部使用数组实现,分别将key和value保存在两个数组中,它避免了自动装箱操作,同时其数据结构不依赖于每个映射对象,因此比起HashMap来说更加高效。
特点:
SparseArray():默认容量为10.
SparseArray(int initialCapacity):指定容量为initialCapacity
E get(int key):获取对应Key的值。
public E get(int key, E valueIfKeyNotFound):获取对应Key的值,没有则返回给定valueIfKeyNotFound。
E valueAt(int index):获取指定索引的value值
int keyAt(int index):返回指定索引的key值
int indexOfKey(int key):获取指定key的索引值
int indexOfValue(E value):获取指定value的索引值,对value使用”==”进行比较
int indexOfValueByValue(E value):获取指定value的索引值,对value使用equals()进行比较
void delete(int key):删除指定key的值,如果不存在key则不进行任何操作。
void remove(int key):内部实现调用delete().
void removeAt(int index):删除指定索引位置的值。
void removeAtRange(int index, int size)。删除index-index+size区间的值。
E removeReturnOld(int key):删除并返回指定key的值。
void clear():清空SparseArray。
void put(int key, E value):添加指定key和value,如果已经存在key,则将该key的value替换为本次传入的value。
void append(int key, E value):添加指定key和value,并且针对键大于数组中所有现有键的情况进行优化。
void setValueAt(int index, E value):替换指定索引位置的value。
int size():获取SparseArray的中存储的个数。
SparseArray clone():克隆SparseArray,实现了Cloneable接口。
String toString():以{key=obj}的形式返回一个字符串。
SparesArray内部采用了两个数据来分别存储key和value,如下:
public class SparseArray<E> implements Cloneable {
private static final Object DELETED = new Object();
private boolean mGarbage = false;
private int[] mKeys;
private Object[] mValues;
private int mSize;
在删除映射对时,并不是将对应值删除,而是保留key,给value添加一个标记:DELETED,从而可以重用该key,最后会在垃圾回收步骤中进行删除,如:
public void delete(int key) {
int i = ContainerHelpers.binarySearch(mKeys, mSize, key);
if (i >= 0) {
if (mValues[i] != DELETED) {
mValues[i] = DELETED;
mGarbage = true;
}
}
}
垃圾回收方法如下:
private void gc() {
// Log.e("SparseArray", "gc start with " + mSize);
int n = mSize;
int o = 0;
int[] keys = mKeys;
Object[] values = mValues;
for (int i = 0; i < n; i++) {
Object val = values[i];
if (val != DELETED) {
if (i != o) {
keys[o] = keys[i];
values[o] = val;
values[i] = null;
}
o++;
}
}
mGarbage = false;
mSize = o;
// Log.e("SparseArray", "gc end with " + mSize);
}