【问题标题】:ArrayList Capacity Limit restrictionArrayList 容量限制限制
【发布时间】:2017-11-01 08:48:00
【问题描述】:

我搜索了 ArrayList 容量问题,但找不到完整的答案。所以在这里再问一次。

我知道我们在 ArrayList 中添加元素的数量和容量是我们可以在该列表中放入多少数据,默认值为 10。

所以这里的问题是在声明是否给予这样的能力

List<String> list = new ArrayList<>(1);

然后我也可以继续添加最多 10 或 20 个元素。 那么这个容量声明是否仅对达到容量时发生的内部重新分配有用?

或者通过给出容量限制,我们可以只限制添加元素的那一点吗?

【问题讨论】:

  • So is this capacity declaration useful only to internal reallocation which happens when it reaches the capacity 阅读javadocs
  • 嗯,你的测试回答了这个问题,不是吗?由于您能够添加超过 1 个元素,因此它不可能是第二个选项。 javadoc也回答了它。为什么不读呢? docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html : 容量是用于存储列表中元素的数组的大小。它总是至少与列表大小一样大。随着元素被添加到 ArrayList,它的容量会自动增长

标签: java arraylist collections


【解决方案1】:

初始容量并不决定您可以向ArrayList 添加多少元素。随着元素的添加,容量会在必要时自动增加。

指定初始容量的动机是性能。如果您知道您的 ArrayList 将包含一百万个元素,那么创建初始容量为 1000000 的 ArrayList 会更有效,因为这样可以避免在添加元素时多次调整 ArrayList 容量的大小。

【讨论】:

  • 我怀疑性能上的差异甚至是可以衡量的。我认为最多只有几微秒,并且指定初始容量会使代码混乱。
  • @DavidConrad 每次增加容量时,都会生成一个新的更大的后备数组,并使用旧数组的内容进行初始化。当这些数组变大时,性能差异可能会开始变得可衡量。
  • @Eran 感谢您提供信息。正如大卫所说,我也只使用了添加 10-20 个元素,所以没有发现任何差异,因此发布了这个问题。正如你解释的那样,现在明白了这一点
  • @DavidConrad 指定初始容量绝对可以使用 jmh 进行测量,即使在相对较小的大小(大约 100 个)时也是如此。通过指定正确的初始容量所提供的加速在各种大小范围内似乎是 20%-40%。不过,这种加速是否显着 是另一个问题。在大多数情况下,这可能无关紧要。
  • 指定初始容量的另一个原因是为了节省空间。如果您知道要创建很多小的 (
【解决方案2】:

ArrayList 由一个最大大小为 Integer.MAX_VALUE - 8 的数组支持。

这些答案中提到了这一点:

【讨论】:

  • 点击你的链接会重定向到http://www.max%20capacity%20of%20an%20array.com/
  • 感谢您发现这一点。现在修复了
【解决方案3】:

ArrayLists 和其他集合将随着它们的容量用完而增长。 然而,他们如何做到这一点取决于“幕后”使用的数据结构

数组列表由 Java 数组支持。当该数组即将被填充时,会创建一个新数组,通常容量是两倍,然后将所有元素从旧数组复制到新数组,然后 ArrayList 指向新数组。

由于数组每次翻倍,向数组中添加元素仍然是一个常数时间操作或 bigO 表示法中的“O(1)”。它是在“摊销时间”内完成的

但是,如果您知道您的 ArrayList 可能包含 n 元素,则可以使用 n 的初始大小声明它。这使得初始 Array 大到足以容纳您期望的元素,而无需进行任何“调整大小”。 (创建更大的数组并复制元素)。

不过,如果您低估了 n,这不是问题,因为 ArrayList 仍会增长以处理额外的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多