Android之SparseArray
这几天在阅读他人代码时,看到sparseArray这个类,以前从来没见过这个类,所以查看了下源代码,下面介绍一下它的作用:
1.SparseArray类似HashMap,其作用是保存键值对(int,object),其中key只可以保存整形,并且它所占的内存比hashmap小
private int[] mKeys;
private Object[] mValues;
private int mSize;
通过以上代码,我们发现,SparseArray它以两个数组来存储数据
public SparseArray() {
this(10);
}
<pre style="background-color:#ffffff;color:#000000;font-family:'宋体';font-size:10.5pt;"><pre name="code" class="html">public SparseArray(int initialCapacity) {
if (initialCapacity == 0) {
mKeys = EmptyArray.INT;
mValues = EmptyArray.OBJECT;
} else {
mValues = ArrayUtils.newUnpaddedObjectArray(initialCapacity);
mKeys = new int[mValues.length];
}
mSize = 0;
}
使用第一个构造方法,默认大小为10,使用第二个构造方法是,我们可以自己制定数据的大小
public E get(int key) {
return get(key, null);
}
public E get(int key, E valueIfKeyNotFound) {
int i = ContainerHelpers.binarySearch(mKeys, mSize, key);
if (i < 0 || mValues[i] == DELETED) {
return valueIfKeyNotFound;
} else {
return (E) mValues[i];
}
}
get()返回与key对象的value,如果数组中没有制定的key,默认放回为空。
get(int key, E valueIfKeyNotFound)使用binarySearch二分法查找,返回与key对应的value,如果未找到指定的value或者是找到的value为空,则返回valueIfKeyNotFound
<pre name="code" class="java"> public void delete(int key) {
int i = ContainerHelpers.binarySearch(mKeys, mSize, key);
if (i >= 0) {
if (mValues[i] != DELETED) {
mValues[i] = DELETED;
mGarbage = true;
}
}
}
使用delete(int key)删除与key对应的value
public int keyAt(int index) {
if (mGarbage) {
gc();
}
return mKeys[index];
}
public E valueAt(int index) {
if (mGarbage) {
gc();
}
return (E) mValues[index];
}
键值查询,可以实现遍历操作
public int indexOfKey(int key) {
if (mGarbage) {
gc();
}
return ContainerHelpers.binarySearch(mKeys, mSize, key);
}
public int indexOfValue(E value) {
if (mGarbage) {
gc();
}
for (int i = 0; i < mSize; i++)
if (mValues[i] == value)
return i;
return -1;
}
获取键值第一次出现的位置
这就是SparseArray的一些方法介绍