Android——SparseArray

一、作用

该类和 Map 相比的优势在于:

  • 避免了基本数据类型的装箱拆箱操作
  • 和 Map 每个存储节点都是一个类对象不通,SparseArray 不需要用于包装的结构体,单个元素的存储成本更加低廉
  • 在数据量不大的情况下,查找效率较高(二分查找)
  • 延迟了垃圾回收的时机,只在需要的时候才一次性进行
  • SparseArray 中的元素按照key升序排列

二、概念

1.SparseArray

(1)总体认识
SparseArray相当于Map,key 固定为 int 类型,在初始化时只需声明 value 的数据类型即可,其内部用两个数组分别来存储 key 列表和 value 列表:int[] mKeysObject[] mValues

mKeysmValues通过如下方式对应起来:
假设要向 SparseArray 中存入key=10,value=200的键值对

  • 假设10在 mKeys 中对应的索引值是 index,则将 value 存入mValues[index]
  • mKeys 中的元素值按照递增的形式存放,每次存放新的键值对都通过二分查找法对mKeys进行排序

(2)全局变量

// 数组元素在没有外部指定值时的默认元素值
private static final Object DELETED=new Object();
// 用于标记当前是否有待回收的元素
private boolean mGarbage=false;
private int[] mKeys;
private Object[] mValues;
// 当前集合元素大小
// 该值不一定是时时处于正确状态,因为有可能只删除key和value两者之一的情况
// 所以在调用size()之前要GC
private int mSize;

(3)构造函数
mKeys 和 mValues 的默认大小都是10,如果初始化时已知数据量的预估大小,则可以直接指定预估容量。

/**
 * Creates a new SparseArray containing no mappings.
 */
public SparseArray() {
    this(10);
}

/**
 * Creates a new SparseArray containing no mappings that will not
 * require any additional memory allocation to store the specified
 * number of mappings.  If you supply an initial capacity of 0, the
 * sparse array will be initialized with a light-weight representation
 * not requiring any additional array allocations.
 */
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;
}

(4)增

(5)删

(6)改

(7)查

待续...

(8)垃圾回收
gc()方法用于移除无效引用,将有效元素合并在一起

三、使用

构造函数
构造时需要指定泛型,可传入构造的 key 数组的大小,也可不传,默认为10。

SparseArray arr = new SparseArray<>();
SparseArray arr2 = new SparseArray<>(100);

增删改查

// 增、改 public void put(int key, E value)
arr.put(5, obj);
// 删
// public void remove(int key):Alias for {@link #delete(int)}
arr.remove(5);
// public void delete(int key)
arr.delete(5);
// 查
// public E get(int key)
arr.get(5);
// public E get(int key, E valueIfKeyNotFound)
arr.get(5, obj);

SparseArray 内部使用数组这种顺序表结构,故同时也提供了通过 index 来操作的方法。

//  int indexOfKey(int key)
arr.indexOfKey(5);
// int indexOfValue(E value)
arr.indexOfValue(obj);

// int keyAt(int index)
arr.keyAt(0);
// E valueAt(int index)
arr.valueAt(0);
// void setValueAt(int index, E value)
arr.setValueAt(0, obj);

// void removeAt(int index)
arr.removeAt(0);
// void removeAtRange(int index, int size)
arr.removeAtRange(0, 4);

Android Studio说:使用HashMap不如使用SparseArray?
面试还在问 SparseArray?记住 3 句话,让你临时把佛脚抱好!

你可能感兴趣的:(Android——SparseArray)