Android SparseArray★★

SparseArray是Android中一种节省内存的数据结构,用于代替HashMap<Integer, E>。它使用两个一维数组存储键值对,减少内存开销。本文详细介绍了SparseArray的特性、重要属性、构造方法、删除与插入方法,以及与HashMap的比较,适合于数据量不大、键为数字的场景。" 88966577,7514566,企业数字化转型:通往智能未来的必经之路,"['企业数字化', '大数据分析', '云计算', '人工智能', 'SaaS']
摘要由CSDN通过智能技术生成

1.SparseArray(稀疏数组)

SparseArray是Android中特有的数据结构,标准的jdk里是没有这个类的。在Android内部用来替代HashMap<Integer,E>这种形式。使用SparseArray更加节省内存空间的使用。SparseArray提供了类似于Map的功能,但是实现方法却和HashMap不一样。SparseArray采用两个一维数组,一个存储key(int类型),一个存储value。而HashMap采用的是一维数组+单链表结构。

SparseArray占用内存空闲小,没有额外的Entry对象。一般几百以内的数据性能相对HashMap要好,大概提升0—50%的性能。

他的几个重要的特点:

①以键值对形式进行存储,基于二分查找,因此查找的时间复杂度为0(LogN);

②SparseArray中直接以int作为Key,避免了HashMap的装箱拆箱操作,性能更高,且int的存储开销远远小于Integer;(不支持任意类型的key,key只能是int类型)

③key总是有序的,不管经过多少次插入,key数组中key总是从小到大排列;(key不一定是连续的)

④采用了延迟删除的机制(针对数组的删除扩容开销大的问题的优化) ;

SparseArray适用于数据量不是很大,同时Key又是数字类型的场景。比如,存储某月中每天的某种数据,最多也只有31个,同时它的key也是数字(可以使用1-31,也可以使用时间戳)。再比如,你想要存储userid与用户数据的映射,就可以使用这个来存储。

 

2.SparseArray重要属性

public class SparseArray<E> implements Cloneable {

    private static final Object DELETED = new Object();

    private boolean mGarbage = false;

    private int[] mKeys;

    private Object[] mValues;

    private int mSize;

    ……

}

SparseArray中的元素较少,下面具体介绍:

①DELETED :static final 的一个静态Object实例,当一个键值对被remove后,会在对应key的value下放置该对象,标记该元素已经被删除(延迟删除)

②mGarbage :当值为true时,标志数据结构中有元素被删除,可以触发gc对无效数据进行回收(此时才真正删除)

③mKeys数组: 用于存放Key的数组,通过int[] 进行存储,与HashMap相比减少了装箱拆箱的操作,同时一个int只占4字节。一个重要特点,mKeys的元素是升序排列的,也是基于此,才能使用二分查找

④mValues数组:用于存放与Key对应的Value,通过数组的position 进行映射;如果存放的是int型等,可以用SparseIntArray ,存放的Values也是int数组,性能更高

⑤mSize:mSize的大小等于数组中mValues的值为非DELETED的元素个数

mKeys和mValues读写时采用的下标是一一对应的。

下面通过一个例子体会一下mSize和mKeys、mValues的对应关系:

SparseArray<Object> SparseArray = new SparseArray<>();

sparseArray.put(0,null);

sparseArray.put(1,"android");

sparseArray.put(3,1);

sparseArray.put(35,new Boolean(true));

sparseArray.put(2,new String("java"));

sparseArray.put(18,new Object());

sparseArray.put(0,"hello world");

int size = sparseArray.size();

for(int i = 0; i <size;i++) {

   log.d(TAG,"i = " + i+ "  ;value = " + SparseArray.get(sparseArray.keyAt(i)));

}

例子中new了一个SparseArray,注意声明时只能指定value的类型,而key是固定为int的。然后再往里面添加key和value。注意key为0的情况插入了两次。

然后通过debug可以看到在内存中SparseArray是如何存储的,如下图可以看出key和value的大小都是11,而且keys的值是按从小到大排序的:

mGarbage=false

mSize=6

   mKeys:{int[11]}              mValues:{Object[11]}

             0=0                               0="hello world"

             1=1                                1="android"  

             2=2                                2="java"

             3=3                                3={Integer} 1

             4=18                              4={Object}

             5=35                              5={Boolean}true

             6=0

             7=0

             8=0

             9=0

             10=0

此时sparseArray.size

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值