如何在Java中获取ArrayList的容量?

Jav*_*ser 18 java collections

众所周知,Java ArrayList是使用数组实现的,初始化容量为10,并且其大小增加了50%.如何获取当前ArrayList容量而不是ArrayList的Size.

谢谢

Mar*_*k B 18

我不认为这是可能的.你的用例是什么?我相信C#ArrayLists具有.capacity属性,但Java ArrayList类不公开此信息.

您有获取初始容量参数的构造函数,并且您可以使用ensureCapacity()方法来减少增量重新分配的数量.

如果您真的担心内存使用情况,也可以使用trimToSize()方法.

  • Vector有一个capacity()方法返回当前容量.您是否花时间查看API?http://java.sun.com/j2se/1.4.2/docs/api/java/util/Vector.html (4认同)
  • 没有mbaird,我只是在调查你的答案.Thx (2认同)
  • 如果您不知道容量,您如何决定何时调用 trimToSize() ?一直调用trimToSize() 效率不高。不暴露能力是错误​​的。 (2认同)

pgr*_*ras 9

你可以通过反思得到它:

public abstract class ArrayListHelper {

    static final Field field;
    static {
        try {
            field = ArrayList.class.getDeclaredField("elementData");
            field.setAccessible(true);
        } catch (Exception e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    @SuppressWarnings("unchecked")
    public static <E> int getArrayListCapacity(ArrayList<E> arrayList) {
        try {
            final E[] elementData = (E[]) field.get(arrayList);
            return elementData.length;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当字段没有被称为`elementData`时,这将失败.由于API中未指定该名称,因此任何实现(以及任何版本!)都可以完全将其称为其他内容. (5认同)
  • @JoachimSauer 仍然调用 elementData,不明白他们为什么要更改它,如果/当他们这样做时,您仍然可以轻松修改代码! (2认同)

Sha*_*ian 7

您可以使用反射来获取 Java 中 ArrayList 的当前容量。这是一个例子:

package examples1;

import java.util.ArrayList;
import java.util.List;
import java.lang.reflect.Field;

public class Numbers {

    public static void main(String[] args) throws Exception {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        System.out.println(getCapacity(numbers));
    }

    static int getCapacity(List al) throws Exception {
        Field field = ArrayList.class.getDeclaredField("elementData");
        field.setAccessible(true);
        return ((Object[]) field.get(al)).length;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将输出:10

笔记:

  1. getCapacity()方法修改自http://javaonlineguide.net/2015/08/find-capacity-of-an-arraylist-in-java-size-vs-capacity-in-java-list-example.html
  2. 请注意,首次添加到列表后将授予默认容量 10。如果您在添加之前尝试此操作,您将得到以下输出0
  3. 要强制容量而不添加,请将其传递到构造函数中,如下所示:

    List<Integer> numbers = new ArrayList<>(20);
    
    Run Code Online (Sandbox Code Playgroud)

  • 哦,非常感谢,伙计。你救了我的命!PS 如果您捕获异常“No field elementData”,我不知道它是什么,但我从 Android Studio 切换到 NetBeans,异常消失了。 (2认同)