ArrayList.trimToSize()方法

时间:2014-01-31 10:49:45

标签: java performance arraylist

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

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

2 个答案:

答案 0 :(得分:6)

来自您自己链接的文档:

  

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

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

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

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

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

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

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

  4. trimToSize()来自消息来源:

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

答案 1 :(得分:1)

嗯,这很简单:

  1. 将ArrayList修剪为当前大小
  2. 是的,您可以最小化ArrayList实例的存储
  3. 如果要修剪ArrayList并最小化其存储空间
  4. 但严重的是:很少有人应该调用这种方法(我个人从不使用它)。它与ArrayList的实现方式有关:顾名思义,ArrayList内部使用数组来存储数据。向ArrayList添加新元素时,会根据需要增加数组的大小。当你向ArrayList添加1000000个元素时,内部数组的.length长度至少为(!)1000000。之后你从ArrayList中删除了999999个元素,那么内部数组仍然 a。长度至少为1000000.对trimToSize的调用将确保内部数组仅具有所需的大小(在本例中为1)。但同样:这几乎没有必要或有益。您通常不应该在ArrayList实例上工作,而是在(更一般的)List接口上工作。