ArrayList和ensureCapacity,奇怪的行为
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList和ensureCapacity,奇怪的行为相关的知识,希望对你有一定的参考价值。
我有以下课程:
class CapacityTrackingArrayList<T> extends ArrayList<T>
{
public boolean add(T elem)
{
System.out.printf("Invoking add()...
");
boolean isAdded = super.add(elem);
return isAdded;
}
public void ensureCapacity(int arg)
{
System.out.printf("Invoking ensureCapacity(%d)...
", 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()。怎么会?
答案
在添加之前,我希望列表能够保持这个容量,直到添加了大约100个元素。 ......显然,根本不是!
我没有看到你在任何地方打印当前的容量(顺便说一下,你不能,除非你hack it with reflection,这是最不可靠的,但在你的实验中暂时有用)。你只打印请求。
总是,在添加元素时,它会调用ensureCapacity()。怎么会?
确保列表具有容纳正在添加的新元素的能力。这并不意味着它实际上会降低容量,它只需要确保容量至少足以容纳新项目。
请参阅the source for ArrayList.ensureCapacity()
以了解正在发生的事情。
但实际上,你没有太多理由关注容量实际上是什么;你有ensureCapacity()
和trimToSize()
与合同行为,这些通常会满足你的需求。
以上是关于ArrayList和ensureCapacity,奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章