使用SparseArray代替HashMap提升性能

SparseArray翻译为稀疏数组,所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。

SparseArray主要用来替代HashMap,它比HashMap更节省内存,在某些情况下比HashMap性能更改。举个例子当这样使用HashMap<\Integer,Bitmap>时,就会有一个提示,推荐使用SparseArray。为什么呢?主要是因为SparseArray不需要对key和和value进行自动装箱操作,它内部结构比HashMap要简单。

内部实现:
SparseArray内部主要是通过两个数组实现的,一个数组用来保存key,一个数组用来保存value。

public class SparseArray implements Cloneable {

private int[] mKeys;
private Object[] mValues;
private int mSize;
}

SparseArray内部实现了一个二分查找算法,主要用来计算索引的映射位置。如果输入的key在区间内,则返回等于或者大于最小的关键字的索引;如果key不再区间内,则返回一个负值,表示在找不到时所在的位置。因此在插入数据时,如果是逆序的话,因为SparseArray在检索数据的时候使用的是二分查找,所以每次插入新数据的时候SparseArray都需要重新排序,因此性能要低。

效率的提升和使用限制
稀疏数组的使用,对于索引是整数的情景,有时能带来一些效率的提升。
1. 减少了hashCode时间消耗
2. 减小了所使用的内存大小。
但在所管理的对象数量很大时,效率却反而有可能更低:
在插入的时候,有可能导致大段数组的复制;
在删除之后,也有可能导致数组的大段元素被按个移动(不是复制数组,而是一个一个单独移动);
索引的映射,采用了二分查找,时间复杂度为O(logn)。

你可能感兴趣的:(Android)