ArrayList和ensureCapacity,奇怪的行为

时间:2014-03-23 17:44:38

标签: java arraylist

我有以下课程:

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()。怎么样?

1 个答案:

答案 0 :(得分:4)

  

在添加之前,我希望列表保持此容量,直到添加了大约100个元素。 ......显然,根本不是!

我没有看到你在任何地方打印当前的容量(顺便说一句,除非你hack it with reflection,这是最不可靠的,但在你的实验中暂时有用)。您只打印请求。

  

总是,在添加元素时,它会调用ensureCapacity()。怎么样?

确保列表具有容量来保存正在添加的新元素。这并不意味着它实际上会减少容量,它只需要确保容量至少足以容纳新项目。

请参阅the source for ArrayList.ensureCapacity()以了解正在发生的事情。

但实际上,你并没有太多理由关心容量究竟是什么;您有ensureCapacity()trimToSize()的合同行为,这些通常会满足您的需求。