众所周知,Java ArrayList是使用数组实现的,初始化容量为10,并且其大小增加了50%.如何获取当前ArrayList容量而不是ArrayList的Size.
谢谢
Mar*_*k B 18
我不认为这是可能的.你的用例是什么?我相信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 <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)
您可以使用反射来获取 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
笔记:
getCapacity()方法修改自http://javaonlineguide.net/2015/08/find-capacity-of-an-arraylist-in-java-size-vs-capacity-in-java-list-example.html0要强制容量而不添加,请将其传递到构造函数中,如下所示:
List<Integer> numbers = new ArrayList<>(20);
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
31774 次 |
| 最近记录: |