ArrayList.trimToSize()方法

我可以在动态arrayList中使用ArrayList.trimToSize()方法吗?

  1. 如果我使用它,会发生什么?
  2. 在动态ArrayList上使用此方法可以获得任何好处。
  3. 在这种情况下,我应该使用这种方法。

提前致谢。

从您自己链接的文档:

将此ArrayList实例的容量调整为列表的当前大小。 应用程序可以使用此操作来最小化ArrayList实例的存储。

在内部, ArrayList存储一个包含所有项的数组。 在某些时刻, ArrayList将通过将所有值复制到更大的数组中来“扩展”此数组。 只要添加项目并且所需容量大于当前项目,就会发生这种情况。 此时发生的是以下代码行:

 int newCapacity = oldCapacity + (oldCapacity >> 1); elementData = Arrays.copyOf(elementData, newCapacity); 

本质上,这将创建一个大小为当前大小的1.5倍的新arrays。 这个方法的作用是调整内部数组的大小,使其没有空的空间。

  1. 什么都不会发生,你可以看到。 您不会丢失任何数据,它只是较小的后备arrays。 将数据添加到arraylist将再次正常扩展arrays。

  2. 我假设你的意思是“正常”的ArrayList 。 如果你使用它,你将减少使用的内存,但如果你仍然会在那之后添加数据也将是徒劳的。这对于小列表来说是无用的。 如果你有一个包含许多项目的ArrayList ,并且你确定你不想再添加那么你可以调用这个方法来减少一些内存占用。

  3. 往上看。 我不认为你很可能会使用它。

来自trimToSize()

 public void trimToSize() { modCount++; int oldCapacity = elementData.length; if (size < oldCapacity) { elementData = Arrays.copyOf(elementData, size); } } 

嗯,这很简单:

  1. ArrayList将被修剪为其当前大小
  2. 是的,您可以最小化ArrayList实例的存储
  3. 当您想要修剪ArrayList并最小化其存储时

但严重的是:很少有人会调用这种方法(我个人从未使用过它)。 它与ArrayList的实现方式有关:顾名思义,ArrayList内部使用数组来存储数据。 向ArrayList添加新元素时,会根据需要增加数组的大小。 当你向ArrayList添加1000000个元素时,内部数组的.length长度至少为(!)1000000。当你从ArrayList中删除999999个元素后,内部数组的长度仍然至少为1000000。然后调用trimToSize将确保内部数组只有所需的大小(在本例中为1)。 但同样:这几乎没有必要或有益。 您通常不应该在ArrayList实例上工作,而是在(更一般的) List接口上工作。