如何查找ArrayList
的容量?
答案 0 :(得分:71)
我很好奇,你需要它做什么?您应该知道容量不是(可能听起来)可以放入ArrayList 的上限。它是一个值,表示可以将多少数据放入列表,而不强制它重新分配内部数组。基本上,容量的概念只是为了让你稍微调整一下性能。
无论如何,也许你已经知道了,所以这里有实际答案。
由ArrayList API提供的界面只是不支持此类用例。这件事情是由很多原因导致的。一个原因是你不应该关心这个。 ArrayList被认为是一个无限数组,它从容量等细节中抽象出来。
最接近控制容量的方法是通过构造函数ArrayList(int initialCapacity)
以及两种方法trimToSize()
和ensureCapacity(int minCapacity)
。
然而,为了好玩,我设法通过丑陋的反思黑客来解决它(不要使用它):
import java.lang.reflect.Field;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) throws Exception {
ArrayList<Integer> list = new ArrayList<Integer>(3);
for (int i = 0; i < 17; i++) {
list.add(i);
System.out.format("Size: %2d, Capacity: %2d%n",
list.size(), getCapacity(list));
}
}
static int getCapacity(ArrayList<?> l) throws Exception {
Field dataField = ArrayList.class.getDeclaredField("elementData");
dataField.setAccessible(true);
return ((Object[]) dataField.get(l)).length;
}
}
<强>输出:强>
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
答案 1 :(得分:19)
不,你不能! Java ArrayList不提供访问其当前容量的方法。
您只能使用构造函数ArrayList(int initialCapacity)构造指定初始容量的ArrayList,或者通过调用ensureCapacity()来增加容量。
答案 2 :(得分:10)
ArrayList
是抽象,适用于可自动增长的List
元素。你很少需要知道它的容量。考虑 Effective Java 2nd Edition,Item 52:通过接口引用对象。尽可能实际,你甚至不应该关心它是ArrayList
还是LinkedList
;它只是一个List
。
尽管如此,您可能会对这些方法感兴趣:
ArrayList(int initialCapacity)
void ensureCapacity(int minCapacity)
ArrayList
实例的容量,以确保它至少可以容纳由minimum capacity参数指定的元素数。 void trimToSize()
ArrayList
实例的容量调整为列表的当前大小。应用程序可以使用此操作来最小化ArrayList
实例的存储。 答案 3 :(得分:1)
您无需担心容量,即内部实施细节。如果内部数组填充,那么它将扩展。您可以使用size()
方法找出ArrayList中当前有多少元素。
答案 4 :(得分:1)
从规范:“容量是用于存储列表中元素的数组的大小。它始终至少与列表大小一样大。当元素添加到ArrayList时,其容量会自动增长。除了添加元素具有恒定的摊销时间成本这一事实之外,未指定增长政策的细节。“
所以没有办法说出当前的容量是什么,也不知道它是如何增长的。
答案 5 :(得分:1)
我将在这里逆势而上......用户有一个问题,尽管没有上下文。没有上下文,知道容量是不必要的,因为后备阵列将增长以适应......
您可以执行以下操作以确定您的ArrayList的容量。副作用是将后备数组修剪为数组中元素的确切数量:
ArrayList list = new ArrayList();
//add a bunch of elements
list.trimToSize();
System.out.println("Capacity = " + list.size());
享受!
答案 6 :(得分:0)
您是否在运行时需要此功能,或者在执行测试时是否可以获得?如果进行测试,通常可以使用您喜欢的IDE调试器查看容量。我没有确切的数字,但1.7通常是容量增长大小。因此,如果您创建一个包含10个项目的arraylist,则java将使其大小为17.
答案 7 :(得分:0)
API不提供它。 在内部,只要在满容量时调用add(..),容量就会乘以一个因子。但是,Java规范没有说明这个常数因素... Sun的实现使用1.5的因子,因此容量的上限为1.5 * size()。
请记住,您可以使用trimToSize()来“压缩”列表并使容量等于size()。