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

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

谢谢

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

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

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

你可以通过反思得到它:

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  int getArrayListCapacity(ArrayList arrayList) { try { final E[] elementData = (E[]) field.get(arrayList); return elementData.length; } catch (Exception e) { throw new RuntimeException(e); } } } 

查看ArrayList的规范,我看不到提供此信息的方法。

也就是说, ensureCapacity方法看起来似乎是朝着正确方向迈出的一步(注意: 它不能保证正确的答案 ):当调用它时,它确保容量至少是指定的参数。 因此,如果ArrayList实现使用此方法来确保容量(与调用某些私有方法/直接操作相关字段相反),则可以通过重写此方法来获取当前容量。 您还需要以类似的方式覆盖trimToSize()

当然,这个解决方案不是非常便携,因为ArrayList的不同实现(在来自其他供应商的JVM上)可能以不同的方式做事。

以下是代码的外观

 public class CapacityTrackingArrayList extends ArrayList { // declare a constructor for each ArrayList constructor ... // Now, capacity tracking stuff: private int currentCapacity = 10; public int getCapacity() { return currentCapacity; } public void ensureCapacity(int arg) { currentCapacity = arg; super.ensureCapacity(arg); } public void trimToSize() { currentCapacity = size(); super.trimToSize(); } } 

您可以使用reflection获取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 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; } } 

这将输出: 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 numbers = new ArrayList<>(20); 

不记得它是否有,但你可以通过查看ArrayList的源代码自己完成。 Java开发人员应该利用SDK捆绑的源代码。

我刚刚查看了ArrayList类的sun文档,我看到的唯一与容量相关的方法是ensureCapacity(int minCapacity),这不是你想要的。 祝你好运!

您可以使用Vector而不是ArrayList。 Vector支持capacity()方法。

使用ArrayList的重点是动态添加新元素,因此没有特定的方法来获取ArrayList的容量。

每次我们动态添加元素都会导致重新分配,并且由于重新分配在时间上是昂贵的,因此防止重新分配可以提高性能,因此您可以通过调用ensureCapacity()手动增加ArrayList的容量,但是再次找不到ArrayList的容量。

ArrayList默认容量是10.once达到最大大小,新容量将是:

新容量=(currentcapacity * 3/2)+1。