一、作用
该类和 Map 相比的优势在于:
- 避免了基本数据类型的装箱拆箱操作
- 和 Map 每个存储节点都是一个类对象不通,SparseArray 不需要用于包装的结构体,单个元素的存储成本更加低廉
- 在数据量不大的情况下,查找效率较高(二分查找)
- 延迟了垃圾回收的时机,只在需要的时候才一次性进行
- SparseArray 中的元素按照
key
升序排列
二、概念
1.SparseArray
(1)总体认识
SparseArray<E>
相当于Map<Integer,E>
,key 固定为 int 类型,在初始化时只需声明 value 的数据类型即可,其内部用两个数组分别来存储 key 列表和 value 列表:int[] mKeys
、Object[] mValues
mKeys
和mValues
通过如下方式对应起来:
假设要向 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<String> arr = new SparseArray<>();
SparseArray<String> 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 句话,让你临时把佛脚抱好!
网友评论