35

可能重复:
如何在 Java 中获取 ArrayList 的容量?

如何找到一个的容量ArrayList

4

8 回答 8

83

我很好奇,你需要它做什么?您应该知道,容量不是(听起来可能)您可以放入 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
于 2010-08-25T10:32:19.807 回答
21

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

您只能使用构造函数ArrayList(int initialCapacity)构造指定初始容量的 ArrayList或通过调用ensureCapacity()来增加容量。

于 2010-08-25T10:23:51.593 回答
10

ArrayList是对可自动增长的元素的抽象。List你很少需要知道它的容量。考虑Effective Java 第 2 版,第 52 条:通过接口引用对象。尽可能实用,你甚至不应该关心它是 aArrayList还是 a LinkedList; 它只是一个List.

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

于 2010-08-25T10:31:23.093 回答
1

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

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

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

享受!

于 2010-08-25T13:02:04.090 回答
1

来自规范:“容量是用于存储列表中元素的数组的大小。它始终至少与列表大小一样大。随着元素被添加到 ArrayList,它的容量会自动增长。详细信息除了添加一个元素具有恒定的摊销时间成本这一事实之外,没有指定增长策略。”

所以没有办法知道当前的容量是多少,也不知道它是如何增长的。

于 2010-08-25T10:28:30.207 回答
1

API 不提供它。在内部,只要在满容量时调用 add(..),容量就会乘以一个因子。但是,Java 规范没有说明这个常数因子... Sun 的实现使用因子 1.5,因此容量的上限为 1.5*size()。

请记住,您可以使用 trimToSize() 来“压缩”列表并使容量等于 size()。

于 2010-08-25T10:30:28.423 回答
0

您无需担心容量,这是一个内部实现细节。如果内部数组填满,那么它将扩展。您可以使用该方法找出 ArrayList 中当前有多少元素size()

于 2010-08-25T10:28:26.580 回答
0

您在运行时需要这个还是在执行测试时可以得到?如果进行测试,您通常可以使用您最喜欢的 IDE 调试器查看容量。我没有确切的数字,但 1.7 通常是容量增长大小。因此,如果您创建一个包含 10 个项目的数组列表,java 会将其大小设为 17。

于 2010-08-25T10:30:07.463 回答