合理使用ArrayMap代替HashMap
转载请标注:
披萨大叔的博客 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相关推荐
- Android内存优化--使用SparseArray和ArrayMap代替HashMap
前言 在Android开发时,我们使用的大部分都是Java的api,比如HashMap这个api,使用率非常高,但是对于Android这种对内存非常敏感的移动平台,很多时候使用一些java的api并不 ...
- 数据结构HashMap(Android SparseArray 和ArrayMap) 1
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...
- Android中HashMap内存优化之ArrayMap和SparseArray
ArrayMap及SparseArray是android的系统API,是专门为移动设备而定制的.用于在一定情况下取代HashMap而达到节省内存的目的. 在Android开发中HashMap使用频率相 ...
- Android技术栈(五)HashMap(包括红黑树)与ArrayMap源码解析
1 总览 本文会对 Android 中常用HashMap(有红黑树)和ArrayMap进行源码解析,其中 HashMap 源码来自 Android Framework API 28 (JDK=1.8) ...
- SparseArray与ArrayMap
SparseArray SparseArray核心代码 两个构造函数默认数组容量10 public SparseArray() {this(10); } public SparseArray(int ...
- Java数据结构和算法:HashMap的实现原理
HashMap源码理解 Java集合之HashMap HashMap原理及实现学习总结 HashMap源码分析 HashMap原理及实现学习总结 1. HashMap概述 HashMap是基于哈希表的 ...
- ArrayMap 源码解析
1.简述 我们都知道 HashMap,它属于 java.util 包下,但是很多人可能对 ArrayMap 并不是很熟悉,通俗来说 ArrayMap 属于 android.util 包下,是用于 An ...
- Android特别的数据结构(二)ArrayMap源码解析
1. 数据结构 public final class ArrayMap<K,V> implements Map<K,V> 由两个数组组成,一个int[] mHashes用来存放 ...
- ArrayMap原理解析
1.ArrayMap是什么 一个通用的key-value映射数据结构 相比HashMap会占用更少的内存空间 android.util和android.support.v4.util都包含对应的Arr ...
最新文章
- 华东师范大学2019年高等代数考研试题
- iOS pods更新失败
- C++ 11三个新特性的简单使用 - std::function、lambda 表达式、智能指针
- 【Spring学习】ring的core模块应用详解
- 阿里巴巴美股股价大跌:创在美上市以来最大单日跌幅
- IIS组件搭建ftp服务器
- 【踩坑】activiti工作流的svg-xml解析报错
- ppt 宏文件 自动保存_让Excel表格自动排序,牛了!
- 4. PKI - 数字签名、CA、数字证书
- 量子力学原理-波恩的概率论
- 摩尔庄园手游服务器链接不稳定,摩尔庄园手游公测常见问题解决方法一览
- 2.3 OverFeat
- c51 c语言 16位二进制转换为bcd码,16位二进制转换为BCD码的C51汇编程序.doc
- 若已知1800年1月1日为星期3,则对于一个给定的年份和月份,输出这个月的最后一天是星期几。
- forwarding
- 在IE禁用的情况下,如何用Microsoft Edge以兼容模式打开网页?
- 一个屌丝程序猿的人生(七十九)
- potplay播放器录制音频
- python爬歌词_python爬虫抓取某易云音乐歌词,从此不在下载
- Django的MTV模式详解
热门文章
- 计算机远程桌面连接如何设置,电脑的远程桌面功能不知道怎么设置_远程桌面连接设置方法 - 驱动管家...
- 24C02、24C16进行字节、页读取、页存取操作
- 基于vue的日历H5
- 毕业前夕清华EMBA课程暨论文写作大总结
- 聚类算法(四)—— 基于词语相似度的聚类算法(含代码)
- ArcGIS矢量图层投影与地理坐标系转为投影坐标系——ArcMap
- 朴素贝叶斯算法实现 | Java | 机器学习 | 贝叶斯
- 用Numpy和Pandas分析二维数据笔记
- Linux查ip查不到(Centos8)
- 售价最贵的20个域名