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相关推荐

  1. 【转】HashMap,ArrayMap,SparseArray源码分析及性能对比

    HashMap,ArrayMap,SparseArray源码分析及性能对比 jjlanbupt 关注 2016.06.03 20:19* 字数 2165 阅读 7967评论 13喜欢 43 Array ...

  2. Android中HashMap内存优化之ArrayMap和SparseArray

    ArrayMap及SparseArray是android的系统API,是专门为移动设备而定制的.用于在一定情况下取代HashMap而达到节省内存的目的. 在Android开发中HashMap使用频率相 ...

  3. 安卓性能优化—使用ArrayMap与SparseArray

    性能优化是我们做开发的必须要熟练掌握的技能,所以我打算写一个性能优化专题,把平时用到的一些优化方法记录下来,以便忘记的时候可以快速查找,同时也给给其他开发者提供微薄之力吧: 这篇文章讲述的是在一些特定 ...

  4. 数据结构HashMap(Android SparseArray 和ArrayMap) 1

    HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...

  5. HashMap,ArrayMap,SparseArray 源码角度分析,Android中的数据结构你该如何去选择?

    table = newTab; 可以看到当我们的table数组存储的节点值大于threshold时,会按我们的当前数组大小的两倍生成一个新的数组,并把旧数组上的数据复制到新数组上这就是我们的HashM ...

  6. Android内存优化--使用SparseArray和ArrayMap代替HashMap

    前言 在Android开发时,我们使用的大部分都是Java的api,比如HashMap这个api,使用率非常高,但是对于Android这种对内存非常敏感的移动平台,很多时候使用一些java的api并不 ...

  7. SparseArray与SparseArrayCompat,SparseArray和ArrayMap

    什么是SparseArray SparseArray是Android独有的类,在标准的JDK中不存在这个类. SparseArray只能在API19以上的系统里面 才有这个类,也就是Android4. ...

  8. Android SparseArray和ArrayMap相关总结

    概述 ArrayMap和SparseArray都是基于二分查找实现的 ArrayMap的优势 结构简单内存占用少,适用于小数据量的情况 SparseArray优势 key值可以使基本类型,避免装箱开箱 ...

  9. Android特别的数据结构(二)ArrayMap源码解析

    1. 数据结构 public final class ArrayMap<K,V> implements Map<K,V> 由两个数组组成,一个int[] mHashes用来存放 ...

最新文章

  1. DevExpress控件使用系列--ASPxUploadControl(图片上传及预览)
  2. 区块链共识算法 PBFT(拜占庭容错)、PAXOS、RAFT简述
  3. python 卡方检验 特征选择_结合Scikit-learn介绍几种常用的特征选择方法
  4. U3D-FSM有限状态机的简单设计
  5. android 弹起键盘把ui顶上去的解决办法
  6. Diango博客--23.单元测试:测试 blog 应用
  7. linux标准I/O——格式化输出
  8. Python怎么使用beautifulsoup来从HTML片段中删除标签
  9. python绘图 条形图 直方图 饼图 箱型图 误差图 多图绘制 图表注释 三维图形
  10. 从宏杉合作伙伴大会看本土存储厂商的“逆袭”
  11. 《关于促进大数据发展的行动纲要》提出三大指导意见
  12. 软件测试的重要性与必要性,软件测试的目的和意义
  13. TCP/IP协议保留地址一览表
  14. 计算机主机闪烁显示器黑屏,显示器黑屏一闪一闪的怎么回事_显示器黑屏一闪一闪解决教程 - 系统家园...
  15. Java多线程---Phaser
  16. 用AnLink多屏协同软件可以同时操作电脑又看手机?
  17. 为什么要努力读书学习,一位清华妈妈总结了7条,太到位了
  18. 在线文档查看器:Gleamtech Document Viewer 6.6.1
  19. 麒麟Kylin系统适配gStore图数据库系统
  20. 福利啊,精品资源大放送

热门文章

  1. 用计算机测出人家的信息,NCAE 信息化办公模拟题 含答案
  2. ZJOI2018游记Round1
  3. java实现iam登录认证_是否可以通过Cloudfront对API网关进行IAM身份验证?
  4. Spring(3)--Spring示例再演示
  5. php实现仿淘票票订票网站
  6. eigen 中的matrix
  7. 直流电动机输出功率与转速的关系问题
  8. 在web服务器上运行jsp文件
  9. 使用 ava 和 jsdom 做前端测试
  10. 计算机专业要用多大显卡,吃鸡需要什么级别的显卡?或许跟你想的不太一样!...