阵列列表的容量

2022-09-01 04:46:13

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

如何找到一个的容量?ArrayList


答案 1

我很好奇,你需要它做什么?您应该知道,容量不是(听起来像)您可以向 ArrayList 投入多少的上限。它是一个值,表示可以向列表中放入多少数据,而无需强制它重新分配其内部数组。基本上,容量的概念只是为了让您稍微调整性能。

无论如何,也许你已经知道了,所以这里有实际的答案。

API 为 ArrayList 提供的接口根本不支持这样的用例。造成这种情况的原因有很多。一个原因是你不应该关心这个。ArrayList被认为是一个无界数组,它从容量等细节中抽象出来。

最接近控制容量的方法是通过构造函数ArrayList(int initialCapacity)和两种方法trimToSize()sureCapacity(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

答案 2

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

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


推荐