gpt4 book ai didi

java - 使用 ArrayList#trimToSize() 方法?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:47:05 26 4
gpt4 key购买 nike

来自 a recently posted question我遇到了ArrayList#trimToSize()这会将支持数组的大小减小到当前集合的大小。

引用javadoc

Trims the capacity of this ArrayList instance to be the list's current size. An application can use this operation to minimize the storage of an ArrayList instance.

Javadoc 说应用程序可以使用后备数组来减少内存占用。如果我没记错的话,这种方法不会对小尺寸有用,因为一些引用的成本不会造成太大影响。

但是因为arraylist使用的算法int newCapacity = (oldCapacity * 3)/2 + 1;在 1.6 和 int newCapacity = oldCapacity + (oldCapacity >> 1);在 1.7 中,同时添加新元素 if oldcapacity很大,那么它将使用上述算法创建一个新的支持数组,并且可能会分配很多不需要的空间,如果在动态扩展后只添加一个元素。

我的方法背后的推理是否正确,或者还有其他一些应用程序?

最佳答案

是的,后备阵列在满时会增加约 50%。例如,下面的程序添加 100 万个条目,调用 trimToSize 然后添加一个条目。添加条目后支持数组的长度为 1.2m,修剪后为 1m,添加一项后为 1.5m。

因此,除非您知道您不会再添加到列表中,否则调用 trimToSize 可能会适得其反。

ArrayList<Integer> list = new ArrayList<>();
Field e = list.getClass().getDeclaredField("elementData");
e.setAccessible(true);
for (int i = 0; i < 1_000_000; i++) {
list.add(i);
}
System.out.println(((Object[]) e.get(list)).length); //1215487
list.trimToSize();
System.out.println(((Object[]) e.get(list)).length); //1000000
list.add(0);
System.out.println(((Object[]) e.get(list)).length); //1500000

关于java - 使用 ArrayList#trimToSize() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21478622/

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