如何找到一个的容量ArrayList
?
8 回答
我很好奇,你需要它做什么?您应该知道,容量不是(听起来可能)您可以放入 ArrayList 的上限。它是一个值,表示您可以将多少数据放入列表中,而无需强制它重新分配内部数组。基本上,容量的概念只是为了让您稍微调整性能。
无论如何,也许你已经知道了,所以这里有实际的答案。
API 为 ArrayList 提供的接口根本不支持这种用例。这件事情是由很多原因导致的。一个原因是你不应该关心这个。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
你不能 !Java ArrayList 不提供访问其当前容量的方法。
您只能使用构造函数ArrayList(int initialCapacity)构造指定初始容量的 ArrayList或通过调用ensureCapacity()来增加容量。
ArrayList
是对可自动增长的元素的抽象。List
你很少需要知道它的容量。考虑Effective Java 第 2 版,第 52 条:通过接口引用对象。尽可能实用,你甚至不应该关心它是 aArrayList
还是 a LinkedList
; 它只是一个List
.
也就是说,您可能会对这些方法感兴趣:
ArrayList(int initialCapacity)
- 构造一个具有指定初始容量的空列表。
void ensureCapacity(int minCapacity)
- 如有必要,增加此
ArrayList
实例的容量,以确保它至少可以容纳最小容量参数指定的元素数量。
- 如有必要,增加此
void trimToSize()
- 将此
ArrayList
实例的容量修剪为列表的当前大小。应用程序可以使用此操作来最小化ArrayList
实例的存储。
- 将此
我要在这里逆势而上……用户有一个问题,尽管没有上下文。没有上下文,知道容量是不必要的,因为后备阵列将增长以适应......
您可以执行以下操作来确定 ArrayList 的容量。副作用是支持数组将被修剪为数组中元素的确切数量:
ArrayList list = new ArrayList();
//add a bunch of elements
list.trimToSize();
System.out.println("Capacity = " + list.size());
享受!
来自规范:“容量是用于存储列表中元素的数组的大小。它始终至少与列表大小一样大。随着元素被添加到 ArrayList,它的容量会自动增长。详细信息除了添加一个元素具有恒定的摊销时间成本这一事实之外,没有指定增长策略。”
所以没有办法知道当前的容量是多少,也不知道它是如何增长的。
API 不提供它。在内部,只要在满容量时调用 add(..),容量就会乘以一个因子。但是,Java 规范没有说明这个常数因子... Sun 的实现使用因子 1.5,因此容量的上限为 1.5*size()。
请记住,您可以使用 trimToSize() 来“压缩”列表并使容量等于 size()。
您无需担心容量,这是一个内部实现细节。如果内部数组填满,那么它将扩展。您可以使用该方法找出 ArrayList 中当前有多少元素size()
。
您在运行时需要这个还是在执行测试时可以得到?如果进行测试,您通常可以使用您最喜欢的 IDE 调试器查看容量。我没有确切的数字,但 1.7 通常是容量增长大小。因此,如果您创建一个包含 10 个项目的数组列表,java 会将其大小设为 17。