簡體   English   中英

ArrayList並確保容量,奇怪的行為

[英]ArrayList and ensureCapacity, strange behavior

我有以下課程:

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個元素為止。

顯然,一點也不!

通常,添加元素時,它會調用sureCapacity()。 怎么會?

在添加之前,我希望該列表能夠保持這種容量,直到添加了大約100個元素為止。 ……顯然不是!

我看不到您在任何地方打印當前容量(順便說一句,您不能使用反射來破解它 ,這雖然充其量是不可靠的,但在實驗中暫時有用)。 您只打印請求。

通常,添加元素時,它會調用sureCapacity()。 怎么會?

確保列表具有容納要添加的新元素的能力 這並不意味着實際上會減少容量,它只需要確保容量至少足以容納新項目即可。

請參閱ArrayList.ensureCapacity()的源代碼,以了解發生了什么。

但是,實際上,您沒有太多理由擔心實際容量是多少。 您具有帶有約定行為的trimToSize() ensureCapacity()trimToSize() ,這些通常可以滿足您的需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM