我有以下课程:
class CapacityTrackingArrayList<T> extends ArrayList<T>
{
public boolean add(T elem)
{
System.out.printf("Invoking add()... \n");
boolean isAdded = super.add(elem);
return isAdded;
}
public void ensureCapacity(int arg)
{
System.out.printf("Invoking ensureCapacity(%d)... \n", arg);
super.ensureCapacity(arg);
}
} // class CapacityTrackingArrayList
并使用...进行测试
CapacityTrackingArrayList<Integer> numberList2 = new CapacityTrackingArrayList<Integer>();
numberList2.ensureCapacity(100);
for (int i = 0; i <= 5; i++)
{
numberList2.add(i);
}
我得到以下输出
Invoking ensureCapacity(100)...
Invoking ensureCapacity(1)...
Invoking add()...
Invoking ensureCapacity(2)...
Invoking add()...
Invoking ensureCapacity(3)...
Invoking add()...
Invoking ensureCapacity(4)...
Invoking add()...
Invoking ensureCapacity(5)...
令我印象深刻的是,即使我打电话
numberList2.ensureCapacity(100);
在添加之前,我希望列表能够保持此容量,直到添加了大约100个元素。
显然,根本没有!
总是,在添加元素时,它会调用ensureCapacity()。怎么样?
答案 0 :(得分:4)
在添加之前,我希望列表保持此容量,直到添加了大约100个元素。 ......显然,根本不是!
我没有看到你在任何地方打印当前的容量(顺便说一句,除非你hack it with reflection,这是最不可靠的,但在你的实验中暂时有用)。您只打印请求。
总是,在添加元素时,它会调用ensureCapacity()。怎么样?
确保列表具有容量来保存正在添加的新元素。这并不意味着它实际上会减少容量,它只需要确保容量至少足以容纳新项目。
请参阅the source for ArrayList.ensureCapacity()
以了解正在发生的事情。
但实际上,你并没有太多理由关心容量究竟是什么;您有ensureCapacity()
和trimToSize()
的合同行为,这些通常会满足您的需求。