答案 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() 来增加容量。
推荐
-
如何使用Java中的RESTful Web服务获取远程/客户端IP地址? 我已经在我的项目中编写了Rest Web服务。Web服务调用可能来自不同 machine.so 我需要通过REST Web服务找出IP地址。 从这个请求.getRemoteAddr()使用这个。 但是我不能使用getRemoteAddr()。因为我的请
-
从包含大量文件的zip文件中提取1文件的最快方法是什么? 我尝试了但它们也缺少一些东西。 LZMA SDK不提供一种如何使用的文档/教程,这非常令人沮丧。没有 javadoc。 虽然7z jbinding没有提供一种简单的方法来只提取1个文件,但是,它只提供了提取zip文件
-
输入/输出流在销毁时是否关闭? Java 中的 InputStreams 和 OutputStreams 是否在销毁时关闭()?我完全理解这可能是不好的形式(特别是在C和C++世界中),但我很好奇。 另外,假设我有以下代码: 无名的FileInputStream是否在p.load
-
Java 程序中的字符串大小是否有任何限制? 我有一个字符串定义为 字符串 xx 我可以分配的字符数是否有任何限制? 2) 我正在将用户输入分配给此字符串 xx。70%的人只说一个字。有时他们给出一个大句子,所以想知道可
-
标签
推荐