gpt4 book ai didi

java - ArrayList 和 EnsureCapacity,奇怪的行为

转载 作者:行者123 更新时间:2023-12-01 18:34:38 25 4
gpt4 key购买 nike

我有以下类(class):

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

最佳答案

before adding, I would expect the list to keep this capacity until about 100 elements have been added. ... Apparently, not at all!

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

Always, when adding an element, it invokes ensureCapacity(). How come?

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

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

但实际上,您没有太多理由关心实际容量是多少;您有 ensureCapacity()trimToSize() 以及契约行为,这些通常可以满足您的需求。

关于java - ArrayList 和 EnsureCapacity,奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22594586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com