ArrayList的容量

时间:2010-08-25 10:22:00

标签: java arraylist capacity

  

可能重复:
  How to get the capacity of the ArrayList in Java?

如何查找ArrayList的容量?

8 个答案:

答案 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

尽管如此,您可能会对这些方法感兴趣:

答案 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()。