Java ArrayList容量限制

Java ArrayList容量限制,java,arraylist,collections,Java,Arraylist,Collections,我已经搜索了ArrayList容量问题,但找不到完整的答案。所以在这里再问一遍 我知道我们在ArrayList中添加的元素数量和容量的大小是我们可以在默认值为10的情况下将多少数据放入该列表中 因此,这里的问题是,当声明是否给予这样的能力时 List<String> list = new ArrayList<>(1); List List=newarraylist(1); 然后我还可以继续添加元素,最多10个或20个。 那么,这个容量声明是否只对内部重新分配有用,而内

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

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

因此,这里的问题是,当声明是否给予这样的能力时

List<String> list = new ArrayList<>(1);
List List=newarraylist(1);
然后我还可以继续添加元素,最多10个或20个。 那么,这个容量声明是否只对内部重新分配有用,而内部重新分配是在达到容量时发生的


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

初始容量并不能确定可以向
阵列列表添加多少元素。当添加元素时,容量会在必要时自动增加


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

ArrayList由一个最大大小为整数的数组支持。最大值为-8

这些答复提到了这一点:


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

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

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

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


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

那么,这个容量声明是否只对内部重新分配有用,当它达到容量时会发生这种情况呢?因为您可以添加多个元素,所以它不可能是第二个选项。javadoc也回答了这个问题。为什么不读呢容量是用于存储列表中元素的数组的大小。它始终至少与列表大小一样大。当元素添加到ArrayList中时,它的容量会自动增长。我怀疑性能上的差异是否可以测量。我认为最多只需要几微秒,指定初始容量会使代码变得混乱。@DavidConrad每次容量增加时,都会生成一个新的更大的备份数组,并使用旧数组的内容进行初始化。当这些阵列变大时,性能差异可能开始变得可衡量。@Eran感谢您提供的信息。。正如David所说,我也只是添加了10-20个元素,所以没有发现任何差异,因此发布了这个问题。正如你现在所解释的,我明白了point@DavidConrad使用jmh可以明确地测量初始容量,即使是在相对较小的尺寸(大约100)下。通过指定正确的初始容量提供的加速比在各种尺寸范围内似乎为20%-40%。不过,这种加速是否显著是另一个问题。在大多数情况下,这可能无关紧要。指定初始容量的另一个原因是为了节省空间。如果您知道将要创建许多小(<5)元素列表,那么与默认容量10个元素相比,您可以节省大量空间。单击链接将重定向到
http://www.max%20capacity%20of%20an%20array.com/
感谢您的关注。现在修好了