a recently posted question 我遇到了 ArrayList#trimToSize() 它将后备数组的大小减少到当前的集合大小。

引用 javadoc



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

但是由于1.6中的arraylist int newCapacity = (oldCapacity * 3)/2 + 1;和1.7中的int newCapacity = oldCapacity + (oldCapacity >> 1);使用的算法,如果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/

10-10 03:49