如何在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
笔记:
-
getCapacity()
方法修改自http://javaonlineguide.net/2015/08/find-capacity-of-an-arraylist-in-java-size-vs-capacity-in-java-list-example.html上的原始方法 - 请注意,在第一次添加到列表后,将授予默认容量10。 如果在添加之前尝试此操作,则输出为
0
-
要在不添加的情况下强制容量,请在构造函数中传递它,如下所示:
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。