根据Sun Java实现,在扩展期间,ArrayList增长到初始容量的3/2,而HashMap的扩展率是原来的两倍。这背后的原因是什么?
根据实现,对于HashMap,容量应该始终是2的幂。这可能是HashMap行为的一个原因。但在这种情况下,问题是,对于HashMap来说,为什么容量总是2的幂?
发布于 2011-02-18 19:44:09
增加ArrayList容量的代价是将支持数组的内容复制到一个新的(更大的)数组中。
对于HashMap,它创建一个新的后备数组,并将所有映射条目放入新数组中。而且,容量越大,发生冲突的风险就越低。这是更昂贵的,并解释了为什么扩展因子更高。1.5 vs. 2.0的原因是什么?我认为这是“最佳实践”或“良好的权衡”。
发布于 2011-02-18 21:21:29
适用于HashMap的
为什么容量应始终为2的幂?
我能想到两个原因。
int bucket = hashcode & (size-1);hashcode%31仅由字符串的最后一个字符确定。如果你存储的文件夹都以/结尾,那就再见O(1)吧。如果您使用的大小为3^n,则如果您增加 n.,则分布不会变得更糟从大小3到9,存储桶2中的每个元素现在都将转到存储桶2、5或7,这取决于更高的数字。这就像把每个桶一分为三。因此整数增长因子的大小将是优选的。(当然,这完全取决于您如何计算哈希码,但任意的增长因子感觉并不“稳定”。)发布于 2011-02-18 20:32:09
HashMap的设计/实现方式它的底层存储桶数量必须是2的幂(即使你给它一个不同的大小,它也会使它成为2的幂),因此它每次都会增长2倍。ArrayList可以是任何大小,并且可以在其增长方式上更加保守。
https://stackoverflow.com/questions/5040753
复制相似问题