为什么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 它会自动执行。
它会在调用 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 它会自动执行。