Java 阵列列表容量

Java 阵列列表容量,java,arraylist,capacity,Java,Arraylist,Capacity,可能重复: 如何找到阵列列表的容量?不,你不能!Java ArrayList不提供访问其当前容量的方法 只能使用构造函数构造指定初始容量的ArrayList,或通过调用来增加容量 您不需要担心容量,这是一个内部实现细节。如果内部数组已填充,则它将展开。您可以使用size()方法找出当前阵列列表中有多少元素。来自规范:“容量是用于存储列表中元素的数组的大小。它始终至少与列表大小一样大。当元素添加到ArrayList时,其容量会自动增长。除了添加要素具有恒定的摊余时间成本这一事实外,未详细说明增长

可能重复:


如何找到
阵列列表的容量?

不,你不能!Java ArrayList不提供访问其当前容量的方法


只能使用构造函数构造指定初始容量的ArrayList,或通过调用来增加容量

您不需要担心容量,这是一个内部实现细节。如果内部数组已填充,则它将展开。您可以使用
size()
方法找出当前阵列列表中有多少元素。

来自规范:“容量是用于存储列表中元素的数组的大小。它始终至少与列表大小一样大。当元素添加到ArrayList时,其容量会自动增长。除了添加要素具有恒定的摊余时间成本这一事实外,未详细说明增长政策。”


因此,无法确定当前容量是多少,也无法确定它是如何增长的。

您是在运行时需要此容量,还是在执行测试时可以获取此容量?如果进行测试,您通常可以使用您喜爱的IDE调试器查看容量。我没有确切的数字,但1.7通常是容量增长的大小。因此,如果您使用10项,java将使其大小为17。

API没有提供它。 在内部,在满容量时,每当调用add(..)时,容量都会乘以一个因子。但是,Java规范没有提到这个常量因子……Sun的实现使用了1.5的因子,因此容量的上限为1.5*size()


请记住,您可以使用trimToSize()来“压缩”列表,并使容量等于size()< <代码> > ARAYLIST//COD>是对元素自动增长的代码>清单>代码的抽象。您很少需要知道它的容量。考虑有效的java第二版,项目52:通过其接口引用对象。实际上,即使是“代码”> ARAYLISTAB/<代码>或<代码>链接目录> /代码>,您甚至不应该关心它。这只是一个
列表

也就是说,您可能对这些方法感兴趣:

    • 构造具有指定初始容量的空列表
    • 如有必要,增加此
      ArrayList
      实例的容量,以确保它至少可以容纳最小容量参数指定的元素数
    • 将此
      ArrayList
      实例的容量修剪为列表的当前大小。应用程序可以使用此操作最小化
      ArrayList
      实例的存储

我很好奇,你需要它做什么?你应该知道,容量不是(听上去)可以放入ArrayList中的数据量上限。该值表示可以放入列表中的数据量,而无需强制列表在内部数组中重新分配。基本上,容量的概念只是为了稍微调整性能

不管怎么说,也许你已经知道了,所以下面是实际的答案

API为ArrayList提供的接口不支持此类用例。原因有很多。其中一个原因是您不应该关心这一点。ArrayList被认为是一个无限数组,它从容量等细节中抽象出来

最接近控制容量的方法是通过构造函数,以及两个方法和

然而,为了好玩,我设法通过一个丑陋的反射黑客解决了这个问题(不要使用这个):


我要在这里逆势而行…用户有一个问题,尽管没有上下文。没有上下文,知道容量是不必要的,因为支持阵列将增长以适应

您可以执行以下操作来确定ArrayList的容量。副作用是备份数组将被修剪为数组中元素的确切数量:

ArrayList list = new ArrayList();
//add a bunch of elements
list.trimToSize();
System.out.println("Capacity = " + list.size());

享受吧!

“不,你不能。“一个驱逐标记会让这件事变得很滑稽。@klex如果有人能对答案投两次赞成票,我现在会再加一个感叹号。所以:我很想投反对票,即使‘虽然它是正确的、深入的,并警告试图绕过它的危险,只是因为它为丑陋的黑客提供了代码……当然,应该强调的是,这种方法不应该在生产代码中使用。但是,可能有人希望调试某些性能问题或类似问题,在这种情况下,上面的代码片段可能很有用。但正如我在回答中所写的,我实现它是为了好玩,99%的情况下都不应该使用它。@aiobee nice hack:)为了让你的答案更完整,我建议你也提到你使用的java sdk/jvm。因为它的成功运行将基于您正在使用的java平台的实现。@Gopi,因为字符串“elementData”?我认为具体的JVM并不重要,但作为参考,我使用了Hotspot和Suns 1.6.0.20 rt.jar。@aiobee是的,因为'elementData'。我认为ArrayList的所有实现可能都没有此字段或同名字段。我认为Bloch对此的说法是确定的。在ArrayList中,size()方法返回列表中有多少元素(对象),而不是容量。不幸的是,它不是API的一部分,但是有点恼人的是,答案中有多少人要么没有回答问题,要么回答了错误的问题。如果没有反思黑客,ArrayList通常不支持容量。如果需要这些数据,只需使用向量即可
Size:  1, Capacity:  3
Size:  2, Capacity:  3
Size:  3, Capacity:  3
Size:  4, Capacity:  5
Size:  5, Capacity:  5
Size:  6, Capacity:  8
Size:  7, Capacity:  8
Size:  8, Capacity:  8
Size:  9, Capacity: 13
Size: 10, Capacity: 13
Size: 11, Capacity: 13
Size: 12, Capacity: 13
Size: 13, Capacity: 13
Size: 14, Capacity: 20
Size: 15, Capacity: 20
Size: 16, Capacity: 20
Size: 17, Capacity: 20
ArrayList list = new ArrayList();
//add a bunch of elements
list.trimToSize();
System.out.println("Capacity = " + list.size());