Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
MoJieBlog opened this issue May 15, 2019 · 5 comments
Open

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

MoJieBlog opened this issue May 15, 2019 · 5 comments
Labels

Comments

@MoJieBlog
Copy link
Collaborator

No description provided.

@whatshappen
Copy link

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

@dongshaohua01
Copy link

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。

@yangfanggang
Copy link

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

@LvKang-insist
Copy link

打卡,学习

@xianfeng92
Copy link

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. 数据量很大时的性能退化

@Moosphan Moosphan added the Java label May 21, 2019
@Moosphan Moosphan changed the title 2019-05-15:谈谈ArrayMap和hashMap的区别? 2019-05-15:谈谈ArrayMap和HashMap的区别? May 21, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

7 participants