Arn*_*was 17 java arraylist hashmap
根据Sun Java Implementation,在扩展期间,ArrayList增长到3/2它的初始容量,而对于HashMap,扩展速率是双倍.这背后的原因是什么?
根据实现,对于HashMap,容量应始终为2的幂.这可能是HashMap行为的原因.但在这种情况下,问题是,对于HashMap,为什么容量应始终为2的幂?
And*_*s_D 14
增加ArrayList容量的昂贵部分是将后备阵列的内容复制为新的(更大的)内容.
对于HashMap,它正在创建一个新的后备数组并将所有映射条目放在新数组中.而且,容量越高,碰撞的风险就越低.这更昂贵,并解释了为什么扩展因子更高.1.5 vs. 2.0的原因?我认为这是"最佳实践"或"良好的权衡".
Ish*_*tar 11
对于HashMap,为什么容量应始终为2的幂?
我可以想到两个原因.
您可以快速确定哈希码进入的存储区.您只需要一个按位AND并且不需要昂贵的模数.int bucket = hashcode & (size-1);
假设我们的增长因子为1.7.如果我们从11开始,下一个大小将是18,然后是31.没问题.对?但是Java中的字符串的哈希码是以素数因子31计算的.字符串进入的存储桶hashcode%31只能由字符串的最后一个字符确定.O(1)如果您存储所有文件夹的文件夹,请再见/.如果您使用的尺寸,例如3^n,分布也不会,如果你增加变得更糟n.从大小3到9存储桶中的每个元素2现在都会变为存储桶2,5或者7取决于更高的数字.就像将每个桶分成三块一样.因此,优选整数生长因子的大小.(当然,这一切都取决于你如何计算哈希码,但任意增长因子都不会感觉'稳定'.)
HashMap 的设计/实现方式是它的底层桶数必须是 2 的幂(即使你给它不同的大小,它也会变成 2 的幂),因此它每次都会增长两倍。ArrayList 可以是任意大小,并且在增长方式上可以更加保守。
| 归档时间: |
|
| 查看次数: |
12594 次 |
| 最近记录: |