为什么hashmap没有像ArrayList那样的ensureCapacity()方法?

ArrayListHashMap都有构造函数来设置初始容量, ArrayList提供了ensureCapacity()以确保在预期插入一些大量元素时内部数组已经增加。 在某些情况下, HashMap也会发生同样的情况。 那么为什么HashMap没有一个确保容量方法可以保持桶准备好呢?

简短的回答是,它不是很有用。

ArrayListHashMap这样的结构有一个容量概念,它是一些内部数组的长度,用户不能直接看到它。 容量与大小不同, 大小是逻辑上包含在结构中的元素或条目的数量。

“容量”这个词实际上是用词不当,因为它实际上并不代表对用户有重要意义的任何限制。 这是一个实现细节。 随着元素或条目的添加,内部数组将自动且透明地resize。 改变容量没有语义。 您无法判断对ensureCapacity()的调用是否实际更改了容量,如果确实更改了容量,则列表或映射仍然等于之前等于的任何值。

在API中具有容量概念的原因是在用户知道将要添加许多元素的情况下提高性能。 在用户知道将要添加许多元素的情况下,这有助于避免重复resize的开销。 最常见的情况是在施工时,您最有可能知道要添加的元素数量。

请注意,批量添加方法( addAllputAll )将查看要添加的内容的大小,并执行一次所需的目标大小调整。

如果你有一个想要添加大量元素的现有列表,你可以调用Arraylist.ensureCapacity() ; 你很清楚要添加多少; 你必须一次添加一个,而不是批量添加; 并且您的应用程序对性能非常敏感,因此您必须避免多次resize。 这似乎非常罕见。

可以想象一个API HashMap.ensureCapacity() 。 如有必要,它会调整内部表的大小,然后将所有元素重新分配到此表的存储区中。 如果将来添加了大量条目,这将有助于避免重复resize/重新resize。 这在语义上是一个合理的事情,但它真正有用的案例数量似乎很小。

最重要的是可以添加HashMap.ensureCapacity() ,但是它没有足够的用途,它从来不是添加它的优先级。

HashMapArrayList根本不同。

ArrayList的“桶”数量只是后备arrays的大小,当它已满时,它已满。

考虑到多个对象可以散列到同一个桶,并且Java采用的冲突解决策略是链接(即创建链表), HashMap中“桶”的数量并不能很好地指示它可以存储多少个对象。或者类似的,如果多个对象在那里散列,则为桶。 (需要引证!)

确保HashMap中的存储桶数量并不能确保在您已经达到负载因素之前将它们全部填满,从而无法忍受性能降低。 因此,负载因子是确保您获得所需性能的更好方法。