2022-05-21ArrayMap和HashMap

首先我们来说一下什么是HashMap:
hash:也称“散列”,就是将任意长度的输入,通过散列算法,变换成为固定长度的输出,,该输出就是散列值,散列值的空间远远小于输入的空间,不同散列可能会得到相同的输出。
HashMap默认是一个容量为16的数组来存储数据,这个数组之中每一个元素又都是存储的Entry类型链表的头结点。
当我们有一个Entry数据想要存储进来的时候,首先计算key对应的hash值,然后使用hash值对数组的长度取余,获取到的数值就是所要存储的数组下标的位置。
这里就引入一个问题:Hash冲突!
当我们的多个元素的hash值相同的时,应该怎么办?这里就体现了链表的作用,会直接的将后来添加的元素加在链表的末尾。

在此补充一个知识点,处理hash冲突的方法有以下几种:

1开放地址法
2再哈希法
3链地址法
4建立公共溢出区

我们知道容量为16的数组,刚开始的时候创建HashMap对象的时候就会分配容量为16的数组,随着我们的元素的加入,当我们的元素的数量达到一定的限制(HashMap的容量>容量*加载因子(0.75))时候就会触发扩容机制,将我们的容量扩大为原来的二倍。
所以一旦我们触发扩容机制,空间就会二倍数的进行增大,若是我们存在很大的数据,那么就要不断地做Hash运算并且进行扩容,这将会对内存空间造成恒大的消耗,所以在Android汇总HashMao是比较耗内存的。

这个时候就出现了ArrayMap数据结构,它更多的考虑内存优化的问题
其中内部采用两个一维数组。
一个用来存储key的hashcode,其下标代表添加元素的起始下标;一个用来存储添加元素的key和value。它属于哈希表。

具体的原理可以看这篇博客:ArrayMap解析 - (jianshu.com)

大致来说就是使用了二分法来进行查找和添加。其中每次扩容原来容量一般的增量,
当对应的容量为8或是4的时候有缓存容的功能,提供相应的内存使用效率。默认容量为0;

优点:相比于HashMap内存空间更占优比HashMap少了一个实体类进行修饰。
容量为4或者8时存在缓存复用的功能,
扩容比HashMap高效。需要重新计算hash值和移动元素,而ArrayMap只需要拷贝。

缺点:数据量大的情况下查询效率比HashMap差。
存取效率低,每次都要进行二分查找找到对应的下标。
没有实现Serializable,不便进行Androidbundle的传输。

使用场景:
1.数据量小。
2.内存要求高。

你可能感兴趣的:(2022-05-21ArrayMap和HashMap)