aio*_*obe 73

我很好奇,你需要它做什么?您应该知道容量不是(可能听起来)您可以放入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;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

  • 当然,应该强调的是,这种方法不应该用在生产代码中.然而,*可能*有人希望,例如,调试一些性能问题或类似问题,在这种情况下,上述代码片段可能是有用的.但正如我在答案中写的那样,我实现了它的乐趣,它不应该在99%的情况下使用. (16认同)
  • 我很想投票决定这一点,即使它是正确的,深入的,并警告试图规避它的危险,只是因为它为丑陋的黑客提供了代码...... (4认同)

Gop*_*opi 19

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

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

  • "你不能." 一个令人厌恶的标记会令这个热闹. (6认同)
  • 现在你得到我的upvote先生! (2认同)

pol*_*nts 10

ArrayList是一个可自动增长的元素的抽象List.你很少需要知道它的容量.考虑Effective Java 2nd Edition,Item 52:通过接口引用对象.实际上,你甚至不应该关心它是否是一个ArrayList或一个LinkedList; 它只是一个List.

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