这几天在阅读他人代码时,看到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的一些方法介绍