ArrayMap结构:

arraymap是数组结构,里面并没有entry结构,而是由两个数组来维护的,mHashes数组中保存的是每一项的HashCode值,mArray中就是键值对,每两个元素代表一个键值对;

SparseArray结构:

它内部则通过两个数组来进行数据存储的,一个存储key(只能为int值),另外一个存储value,为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的数据;put和get时都是按照二分查找进行的,在数据量小的情况下,查找有着较高效率;

而hashmap是数组+链表结构;

arraymap,sparsearay和hashmap区别:

查找效率

hashmap:通过hashcode计算的index直接拿到值;

arraymap:是通过二分法查找拿到值;

sparsearray:通过二分法put和get,适合数据量小场景;

因此数据量大的时候用hashmap;

扩容效率: hashmap通过new 去申请空间并进行再哈希法;而arraymap直接调用system.arraycopy,效率更高;

构造源码:

public class ArrayMap<K, V> extends AbstractMap<K, V> implements Map<K, V> {/*** 默认数组长度*/private static final int DEFAULT_LENGTH = 16;/*** 数据存储的数组*/private Node[] tables;/*** map内元素的数量*/private int index;public ArrayMap() {this(DEFAULT_LENGTH);}/*** @param length 初始化长度*/public ArrayMap(int length) {if (length <= 0) {throw new IllegalArgumentException("非法参数");}tables = new Node[length];}/*** 从Map中获取元素** @param key 获取的对象* @return 查询得到的对象,若是不存在,则返回Null*/@Overridepublic V get(Object key) {V value = null;for (int i = 0; i < index; i++) {Node<K, V> node = tables[i];K nodeKey = node.getKey();if ((nodeKey == null && key == null) || (key != null && key.equals(nodeKey))) {return node.getValue();}}return value;}/*** 在Map中放置Key-Value对** @param key   放置的Key* @param value 放置的Value* @return 返回value*/@Overridepublic V put(K key, V value) {if (index >= tables.length) {throw new ArrayIndexOutOfBoundsException("数组越界");}for (int i = 0; i < index; i++) {Node<K, V> node = tables[i];K nodeKey = node.getKey();if ((nodeKey == null && key == null) || (key != null && key.equals(nodeKey))) {node.setValue(value);return value;}}tables[index] = new Node(key, value);if (++index == tables.length) {resize();}return value;}@Overridepublic int size() {return index;}@Overridepublic void clear() {index = 0;int parLength = tables.length;tables = new Node[parLength];}/*** 尚未实现的方法** @return null*/@Overridepublic Set<Entry<K, V>> entrySet() {Set<Entry<K, V>> set = new HashSet<>();for (int i = 0; i < index; i++) {Node<K, V> node = tables[i];set.add(node);}return set;}/*** 数组扩容*/private void resize() {int parLength = tables.length;Node<K, V>[] newTable = new Node[parLength * 3 / 2];for (int i = 0; i < parLength; i++) {newTable[i] = tables[i];}tables = newTable;}class Node<K, V> implements Entry<K, V> {private K key;private V value;public Node(K key, V value) {this.key = key;this.value = value;}@Overridepublic K getKey() {return key;}@Overridepublic V getValue() {return value;}@Overridepublic V setValue(V value) {this.value = value;return value;}@Overridepublic String toString() {return key + "=" + value;}}
}

HashMap和ArrayMap SparseArray相关推荐

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

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

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

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

  3. Android技术栈--HashMap和ArrayMap源码解析

    1 总览 WARNING!!:本文字数较多,内容较为完整并且部分内容难度较大,阅读本文需要较长时间,建议读者分段并耐心阅读. 本文会对 Android 中常用的数据结构进行源码解析,包括 HashMa ...

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

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

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

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

  6. Andriod HashMap与ArrayMap分析

    hashmap可以说是一个功能强大,且非常常用的工具.但是在移动平台上,google对于某些情况下并不推荐使用hashmap.正所谓魔鬼藏在细节之中,今天我们就从源码分析看看,hashmap带来的性能 ...

  7. Android知识大纲

    Android知识大纲 Java垃圾回收机制 Java内存是如何划分的,Java语言为什么要使用垃圾回收机制? 垃圾判定 1. 标记引用算法 2. 根搜索法 虚拟机栈中的引用对象 方法区中的常量引用对 ...

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

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

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

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

最新文章

  1. 推荐7个看似简约,实则惊艳的实用软件,建议收藏!
  2. 逻辑模型设计步骤-分析主题域
  3. python mysql 帮助类
  4. AndroidStudio报错:Emulator: I/O warning : failed to load external entity file:/C:/Users/Administrator
  5. jsp 选择时分秒控件_【最全】9月计算机考试报名通知(6.19更新,仅差4省市)附:分析如何选择科目...
  6. python学习之路(九)
  7. 语言编写正反星星_厉害!浙理工师生原创短片《星星》入围5个国际电影节
  8. 9:16 2009-7-30 范型,IList 做为参数
  9. java环境变量配置 - win10
  10. CentOS下用于查看系统当前登录用户信息的4种方法
  11. PowerBI功能发布时间线
  12. Asp.Net 4.0 新特性,输出更纯净的Html代码 ClientIDMode,ViewStateMode等
  13. 【Flutter--实战】Dart 语言快速入门
  14. cache文件夹可以删除吗
  15. Unity 游戏框架搭建 2018(八)小结
  16. C++STL之初识容器和迭代器
  17. ubuntu 18.04 开启rc.local
  18. 无线常见问题排查手册
  19. Codeforces Round #777 (Div. 2)(A~C)
  20. 问题锦集 | 百度网盘播放视频显示:网络连接失败,请检查您的网络设置并稍后再试

热门文章

  1. java.sql.SQLSyntaxErrorException: Unknown database报错问题
  2. 马斯克急了!宁德时代丢出“王炸”,性能是特斯拉电池的3倍
  3. HTML Table标签 Div属性 a标签
  4. 单击单元格实现可编辑的表格(学号和姓名下)
  5. windows上Oracle 19c 卸载
  6. 火山PC调试器使用【博客教程】
  7. 神器来袭,手把手教你使用 Milvus_cli
  8. 2019/09/17 03-杨辉三角对称解法和单行列表解法
  9. 飞信通知api_网络通知API
  10. 布谷鸟算法(Cuckoo Search,CS)MATLAB案例详细解析