SparseArray
在Android中,SparseArray是一个专门用于存储稀疏数据(大部分元素为null或默认值)的数组类。常用于存储与整数键关联的对象,其中键是原始数据类型 int,而不是对象类型 Integer。使得 SparseArray 在内存使用上比使用 HashMap<Integer, E> 更高效,因为避免了自动装箱(autoboxing)和拆箱(unboxing)的开销。
SparseArray方法:
- put(int key, E value):向数组中放入一个值。
- get(int key):根据键获取值。
- delete(int key):根据键删除值。
- size():返回数组中当前存储的键值对的数量。
- keyAt(int index):根据索引返回键。
- valueAt(int index):根据索引返回值。
- indexOfKey(int key):返回指定键的索引。
- indexOfValue(E value):返回指定值的索引。
SparseArray在处理稀疏数据时非常有效,如果数据结构不是稀疏的,或者需要存储的键不是整数类型,那么使用HashMap或其他数据结构可能更合适。
例如,在自定义视图中处理大量子视图时,可能会使用SparseArray来存储与每个子视图ID关联的视图对象。
SparseArray性能
- SparseArray内部使用int[] keys数组维护key,而且keys中元素是按照升序进行排序的,使用Object[] values来维护value。
- SparseArray用于映射integers到object。但不像普通数组,SparseArray元素间没有无用的元素。在映射integers到object的过程中,SparseArray采用避免自动装箱的keys而且它的数据结构不依赖于额外的对象来存储映射关系的实现,因此它相比于HashMap占用更少的内存。
- 但是SparseArray在查找keys的过程中使用了二分法查找,这种实现不适合大量的数据的情况。在添加和删除时涉及到数组元素的挪动,因此比HashMap慢。
- 为了优化性能,SparseArray对remove()进行了优化,在删除时并没有立即挤压数组的空间,而是标记为DELETE。被标记为DELETE的元素,要么被重复利用,要么在多次remove后,通过一次gc操作,进行数组空间的挤压。