ArrayList
和 HashMap
都有构造函数来设置初始容量,但是 ArrayList
提供了 ensureCapacity()
来确保如果预计要插入大量元素,则内部数组已经增加。在某些情况下,HashMap
也会发生同样的情况。那么,为什么 HashMap
没有一个确保容量的方法来让桶准备就绪?
最佳答案
简短的回答是,它不是很有用。
像ArrayList
和HashMap
这样的结构有一个容量 的概念,它是一些不直接可见的内部数组的长度用户。容量不同于大小,后者是逻辑上包含在结构中的元素或条目的数量。
“容量”一词实际上用词不当,因为它实际上并不代表对用户重要的任何限制。这是一个实现细节。添加元素或条目时,内部数组将自动且透明地调整大小。更改容量没有语义。您无法判断对 ensureCapacity()
的调用是否真的改变了容量,如果它确实改变了容量,列表或 map 仍然等于它之前等于的任何东西。
在 API 中完全包含容量概念的原因是为了在用户知道将要添加大量元素的情况下提高性能。这有助于避免在用户知道要添加大量元素的情况下重复调整大小的开销。最常见的情况是在构造时,您很可能知道要添加多少元素。
请注意,批量添加方法(addAll
或 putAll
)将查看要添加的内容的大小,并对目标进行一次必要的大小调整。
如果您有一个要向其添加大量元素的现有列表,您将调用 Arraylist.ensureCapacity()
;您很清楚要添加多少;您必须一次添加一个,而不是批量添加;并且您的应用程序对性能非常敏感,因此您必须避免多次调整大小。这似乎很少见。
可以想象一个 API HashMap.ensureCapacity()
。如有必要,它会调整内部表的大小,然后将所有元素重新散列到该表的存储桶中。如果将来添加了很多条目,这将有助于避免重复调整大小/重新散列。这在语义上是合理的做法,但真正有用的情况似乎很少。
最重要的是,可以添加 HashMap.ensureCapacity()
,但它的用处很少,因此从来没有优先考虑添加它。
关于java - 为什么hashmap没有ArrayList那样的ensureCapacity()方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41995694/