为什么ArrayList Class中没有自动调用ArrayList.trimToSize?

Why ArrayList.trimToSize is not Called Automatically in ArrayList Class?

它会在调用 ArrayList.add()

后删除列表中多余的未使用位置

但是为什么在ArrayList中没有自动调用class?

如果添加时 ArrayList 已满,则必须将内容复制到一个新的更大的数组中。基本上:

void add(Object newItem) {
  if (size == array.length) {
    array = Arrays.copyOf(array, newSize);
  }
  array[size++] = newItem;
}

问题是你如何选择 newSize:你显然可以选择一个 刚好 足以容纳新项目的值,即

newSize = size + 1;

但您必须将 size 项复制到新数组中。

如果您以这种方式将十个项目添加到 ArrayList 中,您将复制 0 个项目、1 个项目、2 个项目、3 个项目.... 9 个项目:以这种方式添加的成本是二次的。

相反,采用不同的策略:通过一些乘法因子增加列表的大小,例如2:

* (List size initially 1)
* Add item 1
* Copy array into length-2 array
* Add item 2
* Copy array into length-4 array
* Add item 3
* Add item 4
* Copy array into length-8 array
* Add item 5
* Add item 6
* Add item 7
* Add item 8
* Copy array into length-16 array
* Add item 9
* Add item 10

因此,随着数组变大,您可以减少副本。事实上,数学计算表明,以这种方式添加和调整大小是 线性,而不是二次方。

所以,当然,您最终可能会得到一个太大的支持数组;当你完成向它添加东西后,一定要 trim 它达到容量。但它在时间方面更有效 而不是 到 trim 它会自动执行。