Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-05-15:谈谈ArrayMap和HashMap的区别?

MoJieBlog opened this issue · comments

2019-05-15:谈谈ArrayMap和HashMap的区别?

ArrayMap采用的是数组+数组的形式,一个数组存储key的hash值,一个数组存储value,所以如果数据较大时,效率相对较低;
HashMap采用的是数组+链表/红黑树的形式,数组存放key的hash值,链表存放值,如果值数量超过8,会转成红黑树

1.查找效率
HashMap因为其根据hashcode的值直接算出index,所以其查找效率是随着数组长度增大而增加的。
ArrayMap使用的是二分法查找,所以当数组长度每增加一倍时,就需要多进行一次判断,效率下降

2.扩容数量
HashMap初始值16个长度,每次扩容的时候,直接申请双倍的数组空间。
ArrayMap每次扩容的时候,如果size长度大于8时申请size*1.5个长度,大于4小于8时申请8个,小于4时申请4个。这样比较ArrayMap其实是申请了更少的内存空间,但是扩容的频率会更高。因此,如果数据量比较大的时候,还是使用HashMap更合适,因为其扩容的次数要比ArrayMap少很多。

3.扩容效率
HashMap每次扩容的时候重新计算每个数组成员的位置,然后放到新的位置。
ArrayMap则是直接使用System.arraycopy,所以效率上肯定是ArrayMap更占优势。

4.内存消耗
以ArrayMap采用了一种独特的方式,能够重复的利用因为数据扩容而遗留下来的数组空间,方便下一个ArrayMap的使用。而HashMap没有这种设计。 由于ArrayMap之缓存了长度是4和8的时候,所以如果频繁的使用到Map,而且数据量都比较小的时候,ArrayMap无疑是相当的是节省内存的。

5.总结
综上所述,数据量比较小,并且需要频繁的使用Map存储数据的时候,推荐使用ArrayMap。 而数据量比较大的时候,则推荐使用HashMap。

日常打卡 对这一块不了解 平时也只是简单的使用了hashMap 学习了

打卡,学习

commented

HashMap内部是使用一个默认容量为16的数组来存储数据的,而数组中每个元素却又是一个链表的头结点。所以,更准确的来说,HashMap内部存储结构是使用哈希表的拉链结构(数组+链表/红黑树),其中链表和红黑树是为了解决 hash 冲突而设计了。详细可参照hashMap 思维导图

关注点: 1. 扩容时需要元素移动以及重 hash; 2. 加载因子值选择,以空间换时间; 3. hash 冲突时,使用链表或红黑树存储数据; 4. hash 算法的随机和均匀:扰动函数

ArrayMap是一个<key,value>映射的数据结构,内部是使用两个数组进行数据存储,一个数组记录key的hash值。另外一个数组记录Value值。它会对key使用二分法进行从小到大排序,在加入、删除、查找数据的时候都是先使用二分查找法得到相应的index,然后通过index来进行加入、查找、删除等操作。

关注点:1. 二分查找; 2. 数组扩容; 3. 插入数据时数组元素的移动;4. 以时间换空间, 在Android 上尤其珍贵 5. 数据量很大时的性能退化