首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ArrayList以1.5的速度增长,而Hashmap是2?

为什么ArrayList以1.5的速度增长,而Hashmap是2?
EN

Stack Overflow用户
提问于 2011-02-18 19:31:06
回答 7查看 13.9K关注 0票数 18

根据Sun Java实现,在扩展期间,ArrayList增长到初始容量的3/2,而HashMap的扩展率是原来的两倍。这背后的原因是什么?

根据实现,对于HashMap,容量应该始终是2的幂。这可能是HashMap行为的一个原因。但在这种情况下,问题是,对于HashMap来说,为什么容量总是2的幂?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-02-18 19:44:09

增加ArrayList容量的代价是将支持数组的内容复制到一个新的(更大的)数组中。

对于HashMap,它创建一个新的后备数组,并将所有映射条目放入新数组中。而且,容量越大,发生冲突的风险就越低。这是更昂贵的,并解释了为什么扩展因子更高。1.5 vs. 2.0的原因是什么?我认为这是“最佳实践”或“良好的权衡”。

票数 15
EN

Stack Overflow用户

发布于 2011-02-18 21:21:29

适用于HashMap的

为什么容量应始终为2的幂?

我能想到两个原因。

  1. 您可以快速确定哈希码所在的存储桶。你只需要一个按位AND运算,不需要昂贵的模运算。int bucket = hashcode & (size-1);
  2. Let's说我们有1.7倍的增长。如果我们从11开始,那么下一个大小将是18,然后是31。没问题。对吗?但是在Java中,字符串的哈希码是用31的素因数计算的。然后,字符串进入的存储桶hashcode%31仅由字符串的最后一个字符确定。如果你存储的文件夹都以/结尾,那就再见O(1)吧。如果您使用的大小为3^n,则如果您增加 n.,则分布不会变得更糟从大小39,存储桶2中的每个元素现在都将转到存储桶257,这取决于更高的数字。这就像把每个桶一分为三。因此整数增长因子的大小将是优选的。(当然,这完全取决于您如何计算哈希码,但任意的增长因子感觉并不“稳定”。)
票数 10
EN

Stack Overflow用户

发布于 2011-02-18 20:32:09

HashMap的设计/实现方式它的底层存储桶数量必须是2的幂(即使你给它一个不同的大小,它也会使它成为2的幂),因此它每次都会增长2倍。ArrayList可以是任何大小,并且可以在其增长方式上更加保守。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5040753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档