aio*_*obe 73
我很好奇,你需要它做什么?您应该知道容量不是(可能听起来)您可以放入ArrayList的上限.它是一个值,表示可以将多少数据放入列表,而不强制它重新分配内部数组.基本上,容量的概念只是为了让你稍微调整一下性能.
无论如何,也许你已经知道了,所以这里有实际答案.
API为ArrayList提供的接口根本不支持这种用例.这件事情是由很多原因导致的.一个原因是你不应该关心这个.ArrayList被认为是一个无限数组,它从容量等细节中抽象出来.
你可以控制容量的最接近的是通过构造函数ArrayList(int initialCapacity)
,以及两种方法trimToSize()
和ensureCapacity(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;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
Gop*_*opi 19
你不能 !Java ArrayList不提供访问其当前容量的方法.
您只能使用构造函数ArrayList(int initialCapacity)构造指定初始容量的ArrayList,或通过调用ensureCapacity()来增加容量.
pol*_*nts 10
它ArrayList
是一个可自动增长的元素的抽象List
.你很少需要知道它的容量.考虑Effective Java 2nd Edition,Item 52:通过接口引用对象.实际上,你甚至不应该关心它是否是一个ArrayList
或一个LinkedList
; 它只是一个List
.
也就是说,您可能会对这些方法感兴趣:
ArrayList(int initialCapacity)
void ensureCapacity(int minCapacity)
ArrayList
如有必要,增加此实例的容量,以确保它至少可以容纳由minimum capacity参数指定的元素数.void trimToSize()
ArrayList
实例的容量调整为列表的当前大小.应用程序可以使用此操作来最小化ArrayList
实例的存储. 归档时间: |
|
查看次数: |
60750 次 |
最近记录: |