HashMap和ArrayMap SparseArray
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相关推荐
- 【转】HashMap,ArrayMap,SparseArray源码分析及性能对比
HashMap,ArrayMap,SparseArray源码分析及性能对比 jjlanbupt 关注 2016.06.03 20:19* 字数 2165 阅读 7967评论 13喜欢 43 Array ...
- 数据结构HashMap(Android SparseArray 和ArrayMap) 1
HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...
- Android技术栈--HashMap和ArrayMap源码解析
1 总览 WARNING!!:本文字数较多,内容较为完整并且部分内容难度较大,阅读本文需要较长时间,建议读者分段并耐心阅读. 本文会对 Android 中常用的数据结构进行源码解析,包括 HashMa ...
- HashMap,ArrayMap,SparseArray 源码角度分析,Android中的数据结构你该如何去选择?
table = newTab; 可以看到当我们的table数组存储的节点值大于threshold时,会按我们的当前数组大小的两倍生成一个新的数组,并把旧数组上的数据复制到新数组上这就是我们的HashM ...
- 数据结构HashMap(Android SparseArray 和ArrayMap)
文章目录 HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理, ...
- Andriod HashMap与ArrayMap分析
hashmap可以说是一个功能强大,且非常常用的工具.但是在移动平台上,google对于某些情况下并不推荐使用hashmap.正所谓魔鬼藏在细节之中,今天我们就从源码分析看看,hashmap带来的性能 ...
- Android知识大纲
Android知识大纲 Java垃圾回收机制 Java内存是如何划分的,Java语言为什么要使用垃圾回收机制? 垃圾判定 1. 标记引用算法 2. 根搜索法 虚拟机栈中的引用对象 方法区中的常量引用对 ...
- Android中HashMap内存优化之ArrayMap和SparseArray
ArrayMap及SparseArray是android的系统API,是专门为移动设备而定制的.用于在一定情况下取代HashMap而达到节省内存的目的. 在Android开发中HashMap使用频率相 ...
- Android内存优化--使用SparseArray和ArrayMap代替HashMap
前言 在Android开发时,我们使用的大部分都是Java的api,比如HashMap这个api,使用率非常高,但是对于Android这种对内存非常敏感的移动平台,很多时候使用一些java的api并不 ...
最新文章
- 推荐7个看似简约,实则惊艳的实用软件,建议收藏!
- 逻辑模型设计步骤-分析主题域
- python mysql 帮助类
- AndroidStudio报错:Emulator: I/O warning : failed to load external entity file:/C:/Users/Administrator
- jsp 选择时分秒控件_【最全】9月计算机考试报名通知(6.19更新,仅差4省市)附:分析如何选择科目...
- python学习之路(九)
- 语言编写正反星星_厉害!浙理工师生原创短片《星星》入围5个国际电影节
- 9:16 2009-7-30 范型,IList 做为参数
- java环境变量配置 - win10
- CentOS下用于查看系统当前登录用户信息的4种方法
- PowerBI功能发布时间线
- Asp.Net 4.0 新特性,输出更纯净的Html代码 ClientIDMode,ViewStateMode等
- 【Flutter--实战】Dart 语言快速入门
- cache文件夹可以删除吗
- Unity 游戏框架搭建 2018(八)小结
- C++STL之初识容器和迭代器
- ubuntu 18.04 开启rc.local
- 无线常见问题排查手册
- Codeforces Round #777 (Div. 2)(A~C)
- 问题锦集 | 百度网盘播放视频显示:网络连接失败,请检查您的网络设置并稍后再试
热门文章
- java.sql.SQLSyntaxErrorException: Unknown database报错问题
- 马斯克急了!宁德时代丢出“王炸”,性能是特斯拉电池的3倍
- HTML Table标签 Div属性 a标签
- 单击单元格实现可编辑的表格(学号和姓名下)
- windows上Oracle 19c 卸载
- 火山PC调试器使用【博客教程】
- 神器来袭,手把手教你使用 Milvus_cli
- 2019/09/17 03-杨辉三角对称解法和单行列表解法
- 飞信通知api_网络通知API
- 布谷鸟算法(Cuckoo Search,CS)MATLAB案例详细解析