ArrayMap和SparseArray
ArrayMap
存放key-value键值对,key可以是多种类型
实现原理
存储结构,两个数组存储,一个存key的hash,一个存key和value
mHashes[],递增有序数组
mArray[],一个key对象mArray里面2个位置,保持key和value
ArrayMap优点:
- 数组缓存设计,内存利用率高,即使收缩,避免了频繁的创建数组带来的内存消耗
- 删除元素时的下界控制,防止抖动
- 迭代效率高,可以使用索引来迭代(keyAt()方法以及valueAt() 方法)
ArrayMap缺点:
- 存取复杂度高,花费大
- 二分查找的O(log n )时间复杂度远远小于HashMap
- ArrayMap没有实现Serializable,不利于在Android中借助Bundle传输。
使用场景
数量小于1000级别的,尤其是在查询多,插入数据和删除数据不频繁的情况
SimpleArrayMap
二分查找
为了解决内存抖动问题,把一些废弃的hash数组与object数组会缓存起来,下次在分配内存的时候直接使用缓存的数组
SimpleArrayMap会回收废弃的数组,在使用小于8的数组的时候,不必频繁的开辟空间
扩容:4、8、12、18
https://blog.csdn.net/industriously/article/details/72870977
SparseArray
存放key-value键值对,key只能为int
SparseBooleanArray,SparseIntArray,SparseLongArray,LongSparseArray
SparseArray<String> sparseArray= new SparseArray<>();//增加元素,append方式sparseArray.append(0, "myValue");//增加元素,put方式sparseArray.put(1, "myValue");//删除元素,二者等同sparseArray.remove(1);sparseArray.delete(1);//修改元素,put或者append相同的key值即可sparseArray.put(1,"newValue");sparseArray.append(1,"newValue");//查找,遍历方式1for(int i=0;i<sparseArray.size();i++){Log.d(TAG,sparseArray.valueAt(i));}//查找,遍历方式2for(int i=0;i<sparseArray.size();i++){int key = sparseArray.keyAt(i);Log.d(TAG,sparseArray.get(key));}
实现原理
mKeys数组是按照key值递增存储的,也就是升序,
mValues数组用于存储值
SparseArray 优点:
- 避免存取元素时的装箱和拆箱
- 频繁的插入删除操作效率高(延迟删除机制保证了效率)
- 会定期通过gc函数来清理内存,内存利用率高
- 放弃hash查找,使用二分查找,更轻量
SparseArray缺点:
二分查找的时间复杂度O(log n),大数据量的情况下,效率没有HashMap高
SparseArray应用场景:
item数量为小于1000级别的,存取的value为指定类型的,比如boolean、int、long,可以避免自动装箱和拆箱问题
ArraySet
mHashes保存mArray每个元素的hash值,且mHashes和mArray相同下标的元素一一对应
优势:
ArraySet使用更少的存储单元存储元素
ArraySet使用int类型的数组存储hash,使用Object类型数组存储元素,相较于HashMap使用Node存储节点,ArraySet存储一个元素占用的内存更小。
ArraySet在扩容时容量变化更小
HashMap在扩容的时候,往往会对原来的容量扩大一倍,而ArraySet在元素超过8之后,只会增加元素个数的1/2,在扩容过程中更省内存空间。
劣势
存储大量元素(超过1000)时比较耗时
https://blog.csdn.net/hq942845204/article/details/81293480
ArrayMap和SparseArray相关推荐
- 【转】HashMap,ArrayMap,SparseArray源码分析及性能对比
HashMap,ArrayMap,SparseArray源码分析及性能对比 jjlanbupt 关注 2016.06.03 20:19* 字数 2165 阅读 7967评论 13喜欢 43 Array ...
- Android中HashMap内存优化之ArrayMap和SparseArray
ArrayMap及SparseArray是android的系统API,是专门为移动设备而定制的.用于在一定情况下取代HashMap而达到节省内存的目的. 在Android开发中HashMap使用频率相 ...
- 安卓性能优化—使用ArrayMap与SparseArray
性能优化是我们做开发的必须要熟练掌握的技能,所以我打算写一个性能优化专题,把平时用到的一些优化方法记录下来,以便忘记的时候可以快速查找,同时也给给其他开发者提供微薄之力吧: 这篇文章讲述的是在一些特定 ...
- 数据结构HashMap(Android SparseArray 和ArrayMap) 1
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...
- HashMap,ArrayMap,SparseArray 源码角度分析,Android中的数据结构你该如何去选择?
table = newTab; 可以看到当我们的table数组存储的节点值大于threshold时,会按我们的当前数组大小的两倍生成一个新的数组,并把旧数组上的数据复制到新数组上这就是我们的HashM ...
- Android内存优化--使用SparseArray和ArrayMap代替HashMap
前言 在Android开发时,我们使用的大部分都是Java的api,比如HashMap这个api,使用率非常高,但是对于Android这种对内存非常敏感的移动平台,很多时候使用一些java的api并不 ...
- SparseArray与SparseArrayCompat,SparseArray和ArrayMap
什么是SparseArray SparseArray是Android独有的类,在标准的JDK中不存在这个类. SparseArray只能在API19以上的系统里面 才有这个类,也就是Android4. ...
- Android SparseArray和ArrayMap相关总结
概述 ArrayMap和SparseArray都是基于二分查找实现的 ArrayMap的优势 结构简单内存占用少,适用于小数据量的情况 SparseArray优势 key值可以使基本类型,避免装箱开箱 ...
- Android特别的数据结构(二)ArrayMap源码解析
1. 数据结构 public final class ArrayMap<K,V> implements Map<K,V> 由两个数组组成,一个int[] mHashes用来存放 ...
最新文章
- DevExpress控件使用系列--ASPxUploadControl(图片上传及预览)
- 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述
- python 卡方检验 特征选择_结合Scikit-learn介绍几种常用的特征选择方法
- U3D-FSM有限状态机的简单设计
- android 弹起键盘把ui顶上去的解决办法
- Diango博客--23.单元测试:测试 blog 应用
- linux标准I/O——格式化输出
- Python怎么使用beautifulsoup来从HTML片段中删除标签
- python绘图 条形图 直方图 饼图 箱型图 误差图 多图绘制 图表注释 三维图形
- 从宏杉合作伙伴大会看本土存储厂商的“逆袭”
- 《关于促进大数据发展的行动纲要》提出三大指导意见
- 软件测试的重要性与必要性,软件测试的目的和意义
- TCP/IP协议保留地址一览表
- 计算机主机闪烁显示器黑屏,显示器黑屏一闪一闪的怎么回事_显示器黑屏一闪一闪解决教程 - 系统家园...
- Java多线程---Phaser
- 用AnLink多屏协同软件可以同时操作电脑又看手机?
- 为什么要努力读书学习,一位清华妈妈总结了7条,太到位了
- 在线文档查看器:Gleamtech Document Viewer 6.6.1
- 麒麟Kylin系统适配gStore图数据库系统
- 福利啊,精品资源大放送