我们经常会使用到HashMap这个容器,它非常好用,但是却很占用内存。下图演示了HashMap的简要工作原理:

为了解决HashMap更占内存的弊端,Android提供了内存效率更高的ArrayMap。它内部使用两个数组进行工作,其中一个数组记录key hash过后的顺序列表,另外一个数组按key的顺序记录Key-Value值,如下图所示:

当你想获取某个value的时候,ArrayMap会计算输入key转换过后的hash值,然后对hash数组使用二分查找法寻找到对应的index,然后我们可以通过这个index在另外一个数组中直接访问到需要的键值对。如果在第二个数组键值对中的key和前面输入的查询key不一致,那么就认为是发生了碰撞冲突。为了解决这个问题,我们会以该key为中心点,分别上下展开,逐个去对比查找,直到找到匹配的值。如下图所示:

随着数组中的对象越来越多,查找访问单个对象的花费也会跟着增长,这是在内存占用与访问时间之间做权衡交换。

既然ArrayMap中的内存占用是连续不间断的,那么它是如何处理插入与删除操作的呢?请看下图所示,演示了Array的特性:

很明显,ArrayMap的插入与删除的效率是不够高的,但是如果数组的列表只是在一百这个数量级上,则完全不用担心这些插入与删除的效率问题。HashMap与ArrayMap之间的内存占用效率对比图如下:

与HashMap相比,ArrayMap在循环遍历的时候也更加简单高效,如下图所示:

前面演示了很多ArrayMap的优点,但并不是所有情况下都适合使用ArrayMap,我们应该在满足下面2个条件的时候才考虑使用ArrayMap:

  • 对象个数的数量级最好是千以内
  • 数据组织形式包含Map结构



原文链接:http://hukai.me/android-performance-patterns-season-3/


http://blog.csdn.net/xyz_fly/article/details/7931943

更多相关文章

  1. Android虚拟机效率问题
  2. Android资源文件中保存字符串数组详解
  3. Android(安卓)socket高级用法(自定义协议和Protocol Buffer使用)
  4. Android(安卓)解析内存泄漏
  5. android app内存使用限制
  6. ListView----Adapter的使用
  7. Android的图片缓存ImageCache
  8. android后台进程的问题,大家各抒己见
  9. 为什么我在逐渐冷落HashMap,扶SparseArray上位

随机推荐

  1. C语言 7.0
  2. 告别2020,迎接2021!
  3. Linux修改Bash配置文件
  4. 使用原生 js 完成一个购物车页面和 ES6
  5. 程序员翻车时的 30 种常见反应!
  6. MySQL命令操作
  7. 一分钟上手Docker容器
  8. Spring Cloud微服务Sentinel+Apollo限流
  9. 写了10年JAVA代码,为何还是给人一种乱糟糟
  10. Python入门课程零基础到精通——基本数学