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

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中,当添加新元素时,如果oldcapacity很大,那么它将使用上述算法创建一个新的后备数组,如果在动态扩展后只添加一个元素,则可以分配很多不需要的空间.

我的理由是正确的方法背后还是有其他一些应用程序?

最佳答案
是的,支持阵列在满员时增加了约50%.例如,下面的程序增加了100万个条目,调用trimToSize然后添加一个条目.添加条目后,背衬阵列的长度为1.2米,修剪后1米,添加一个项目后1.5米.

因此,除非您知道不再添加到列表中,否则调用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()方法? - 代码日志