转载请标注:
披萨大叔的博客 http://blog.csdn.net/qq_27258799/article/details/51861350

我们都知道当key是int的时候,用SparseArray代替HashMap是个更省内存的方案。如果key是String或者其他自定义类型呢,不要忘了还有ArrayMap。

ArrayMap是一个< key,value >映射的数据结构,它设计上更多的是考虑内存的优化,内部是使用两个数组进行数据存储,一个数组记录key的hash值,另外一个数组记录Value值,它和SparseArray一样,也会对key使用二分法进行从小到大排序,在添加、删除、查找数据的时候都是先使用二分查找法得到相应的index,然后通过index来进行添加、查找、删除等操作,所以,应用场景和SparseArray的一样,如果在数据量比较大的情况下,那么它的性能将退化至少50%。

所以ArrayMap是牺牲了时间换区空间。在写手机app时,适时的使用ArrayMap,会给内存使用带来可观的提升。

ArrayMap和HashMap主要不同之处在于:

1、存储方式不同:ArrayMap内部使用两个数组,一个存HashCode,一个存键值对对象。HashMap内部是Entry对象,没看过HashMap源码的,可以先看看 HashMap源码分析

2、扩容方式不同:上面HashMap源码分析这篇文章说过了,HashMap初始大小是16,达到满容量的0.75时,要扩容,每次都是上次容量的2倍。而ArrayMap是这样

      //如果容量不够if (mSize >= mHashes.length) {final int n = mSize >= (BASE_SIZE*2) ? (mSize+(mSize>>1)): (mSize >= BASE_SIZE ? (BASE_SIZE*2) : BASE_SIZE);if (DEBUG) Log.d(TAG, "put: grow from " + mHashes.length + " to " + n);final int[] ohashes = mHashes;final Object[] oarray = mArray;//分配数组allocArrays(n);if (mHashes.length > 0) {if (DEBUG) Log.d(TAG, "put: copy 0-" + mSize + " to 0");//特别注意这,是copy,而不是new,效率提升System.arraycopy(ohashes, 0, mHashes, 0, ohashes.length);System.arraycopy(oarray, 0, mArray, 0, oarray.length);}//释放无用空间,收缩数组freeArrays(ohashes, oarray, mSize);} 

ArrayMap用的是copy数据,所以效率相对要高。

最后说说使用场景,如果存储数量在千级以下,可以考虑用ArrayMap代替HashMap,但要注意的是,ArrayMap要比HashMap慢。Android里的Bundle内部就是ArrayMap,所以大家可以自行考虑使用。

合理使用ArrayMap代替HashMap相关推荐

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

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

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

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

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

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

  4. Android技术栈(五)HashMap(包括红黑树)与ArrayMap源码解析

    1 总览 本文会对 Android 中常用HashMap(有红黑树)和ArrayMap进行源码解析,其中 HashMap 源码来自 Android Framework API 28 (JDK=1.8) ...

  5. SparseArray与ArrayMap

    SparseArray SparseArray核心代码 两个构造函数默认数组容量10 public SparseArray() {this(10); } public SparseArray(int ...

  6. Java数据结构和算法:HashMap的实现原理

    HashMap源码理解 Java集合之HashMap HashMap原理及实现学习总结 HashMap源码分析 HashMap原理及实现学习总结 1. HashMap概述 HashMap是基于哈希表的 ...

  7. ArrayMap 源码解析

    1.简述 我们都知道 HashMap,它属于 java.util 包下,但是很多人可能对 ArrayMap 并不是很熟悉,通俗来说 ArrayMap 属于 android.util 包下,是用于 An ...

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

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

  9. ArrayMap原理解析

    1.ArrayMap是什么 一个通用的key-value映射数据结构 相比HashMap会占用更少的内存空间 android.util和android.support.v4.util都包含对应的Arr ...

最新文章

  1. 华东师范大学2019年高等代数考研试题
  2. iOS pods更新失败
  3. C++ 11三个新特性的简单使用 - std::function、lambda 表达式、智能指针
  4. 【Spring学习】ring的core模块应用详解
  5. 阿里巴巴美股股价大跌:创在美上市以来最大单日跌幅
  6. IIS组件搭建ftp服务器
  7. 【踩坑】activiti工作流的svg-xml解析报错
  8. ppt 宏文件 自动保存_让Excel表格自动排序,牛了!
  9. 4. PKI - 数字签名、CA、数字证书
  10. 量子力学原理-波恩的概率论
  11. 摩尔庄园手游服务器链接不稳定,摩尔庄园手游公测常见问题解决方法一览
  12. 2.3 OverFeat
  13. c51 c语言 16位二进制转换为bcd码,16位二进制转换为BCD码的C51汇编程序.doc
  14. 若已知1800年1月1日为星期3,则对于一个给定的年份和月份,输出这个月的最后一天是星期几。
  15. forwarding
  16. 在IE禁用的情况下,如何用Microsoft Edge以兼容模式打开网页?
  17. 一个屌丝程序猿的人生(七十九)
  18. potplay播放器录制音频
  19. python爬歌词_python爬虫抓取某易云音乐歌词,从此不在下载
  20. Django的MTV模式详解

热门文章

  1. 计算机远程桌面连接如何设置,电脑的远程桌面功能不知道怎么设置_远程桌面连接设置方法 - 驱动管家...
  2. 24C02、24C16进行字节、页读取、页存取操作
  3. 基于vue的日历H5
  4. 毕业前夕清华EMBA课程暨论文写作大总结
  5. 聚类算法(四)—— 基于词语相似度的聚类算法(含代码)
  6. ArcGIS矢量图层投影与地理坐标系转为投影坐标系——ArcMap
  7. 朴素贝叶斯算法实现 | Java | 机器学习 | 贝叶斯
  8. 用Numpy和Pandas分析二维数据笔记
  9. Linux查ip查不到(Centos8)
  10. 售价最贵的20个域名