我可以在动态arrayList中使用ArrayList.trimToSize()方法吗?
提前致谢。
答案 0 :(得分:6)
来自您自己链接的文档:
将此ArrayList实例的容量调整为列表的当前大小。应用程序可以使用此操作来最小化ArrayList实例的存储。
ArrayList
内部存储一个包含所有项目的数组。在某些时刻,ArrayList
将通过将所有值复制到更大的数组中来“扩展”此数组。只要添加项目并且所需容量大于当前项目,就会发生这种情况。此时发生的是以下代码行:
int newCapacity = oldCapacity + (oldCapacity >> 1);
elementData = Arrays.copyOf(elementData, newCapacity);
本质上,这将创建一个大小为当前大小1.5倍的新数组。这个方法的作用是调整内部数组的大小,使其没有空的空间。
对您而言,什么都不会发生。你不会丢失任何数据,它只是较小的后备阵列。将数据添加到arraylist将再次正常扩展阵列。
我认为你的意思是“正常”ArrayList
。如果你使用它,你将减少使用的内存,但如果你仍然会在那之后添加数据也将是徒劳的。它对于小列表来说是无用的。如果您有许多项ArrayList
,并且您确定不再需要添加,那么您可以调用此方法来减少一些内存占用。
见上文。我认为你很可能不会使用它。
trimToSize()
来自消息来源:
public void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (size < oldCapacity) {
elementData = Arrays.copyOf(elementData, size);
}
}
答案 1 :(得分:1)
嗯,这很简单:
但严重的是:很少有人应该调用这种方法(我个人从不使用它)。它与ArrayList的实现方式有关:顾名思义,ArrayList内部使用数组来存储数据。向ArrayList添加新元素时,会根据需要增加数组的大小。当你向ArrayList添加1000000个元素时,内部数组的.length长度至少为(!)1000000。之后你从ArrayList中删除了999999个元素,那么内部数组仍然 a。长度至少为1000000.对trimToSize
的调用将确保内部数组仅具有所需的大小(在本例中为1)。但同样:这几乎没有必要或有益。您通常不应该在ArrayList
实例上工作,而是在(更一般的)List
接口上工作。