繁体   English   中英

为什么 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中添加 10 项,您将复制 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

所以,随着数组变大,你做的副本会越来越少。 事实上,数学表明以这种方式添加和调整大小是线性的,而不是二次的。

所以,当然,你最终可能会得到一个太大的后备数组; 当您完成向其中添加内容时,请务必将其修剪到容量。 但是从时间上讲,自动修剪它更有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM