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
- Android内存优化—SparseArray和ArrayMap
- Android内存优化---使用SparseArray和ArrayMap
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化之取代HashMap(SparseArray和ArrayMap解析)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- [LeetCode]44 通配符的匹配
- 51Nod 1459 迷宫游戏 (dijkstra)
- Android 之Loader(加载器)
- 字符、字节的概念及其区别
- Hibernate实现增删改查
- Android内存优化—SparseArray和ArrayMap
- 编程学习第二天,初识Python
- [leetcode] 261. Graph Valid Tree 解题报告
- Android设置透明、半透明等效果
- Android 之Fragment
- 9、Hadoop的I/O
- 以cochrane抓取recipe为例,谈谈recursions参数的作用
- 学习设计模式 (二)(总结)
- JS事件代理