Android内存优化—SparseArray和ArrayMap

来源:互联网 发布:apache 设置访问目录 编辑:程序博客网 时间:2024/05/17 01:47

在开发过程中,如果要使用键值对的方式来存储数据时,我们首先会想到的是HashMap,但了解HashMap的内部结构的话就知道,HashMap是比较消耗内存的,所以Android推出了SparseArray和ArrayMap来优化存储。

让我们首先来看一下HashMap的存储结构,其实HashMap内部是一个哈希表,而且采用分离链表法来解决哈希冲突的问题,如下图



另外HashMap有一个装填因子,当里面存储的对象数量与容量的比值大于装填因子时,HashMap就需要重新申请一片比原来大一倍的存储空间,而且要将原来存储的数据重新散列到新的存储空间中。也就是说要如果存储100个数据,需要申请比100个数据更大的存储空间,还伴随着一系列哈希值的计算,这对于内存比较宝贵移动平台来说无疑是个浪费。

接着让我们看看SparseArray的优越性

SparseArray内部通过两个数组来存储,一个存储key,一个存储value,而且key必须是整型的,同时,SparseArray在存储和读取数据时候,使用的是二分查找法.也就是在添加数据的时候,会使用二分查找法和之前的key比较当前我们添加的元素的key的大小,然后按照从小到大的顺序排列好,所以,SparseArray存储的元素都是按元素的key值从小到大排列好的。而在获取数据的时候,也是使用二分查找法判断元素的位置,所以,在获取数据的时候非常快,比HashMap快的多,因为HashMap获取数据是通过遍历Entry[]数组来得到对应的元素。


虽说SparseArray性能比较好,但是由于其添加、查找、删除数据都需要先进行一次二分查找,所以在数据量大的情况下性能并不明显,将降低至少50%。


所以SpraseArray的使用场景是:

1.数据了不大,最好在千级以内

2.key为int类型


ArrayMap和SpraseArray差不多,也是采用两个数组,不同的是ArrayMap的存储的是key的哈希值,所以ArrayMap的key不限定类型。


参考链接:

http://www.codes51.com/article/detail_163576.html


0 0
原创粉丝点击