SparseArray指的是稀疏数组,就是数组中并没有填满,只有部分有值,这样造成了内存浪费,往往采用的是压缩的方式来存储内容。
了解下SparseArray怎么存储的以及SparseArray的扩容。
看下代码
public class SparseArray<E> implements Cloneable {
//内部是两个数组,一个用来存储key值得映射,一个用来存储value
private int[] mKeys;
private Object[] mValues;
private int mSize;
public SparseArray() {
this(10);
}
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;
}
看下put()方法
public void put(int key, E value) {
//二分搜索,查找当前Key值在数组中的位置,这个二分查找挺有意思的
int i = ContainerHelpers.binarySearch(mKeys, mSize, key);
//如果当前值不是负数,说明key值在数组中的映射存在,直接覆盖就行
if (i >= 0) {
mValues[i] = value;
} else {//如果是负数,说明key值得映射不存在,需要新添加
//这里为什么要取反?是因为通过上面的二分查找在mKeys中没有找到对应的key值,
//二分查找会返回一个最佳位置,
//这个最佳位置是取反过的,是一个负数,这里再次取反其实是还原了位置i。
i = ~i;
//如果key值要映射的最佳位置是小于mSize,并且当前位置的值没有被填充,那直接赋值就行。
if (i <