如果我理解ArrayLists,它们会被一个数组支持,该数组在完整时会自动调整大小。 在调用clear()时,ArrayList是否调整为可能的最小数组大小?
答案 0 :(得分:10)
不,不是,这是一个需要牢记的问题。假设ArrayList的内部Object []增长到1000000个元素。现在你调用ArrayList.clear()。这会将所有1000000个元素设置为null,将内部大小设置为0. Nulling 1000000是一个耗时的操作,而ArrayList仍然会在堆上占用1000000 x 4个字节的Object []。您可以在clear()之后调用ArrayList.trimToSize()但是有一个catch - 您首先清除了1000000个元素然后将它们扔掉。在这种情况下,更好的解决方案是重新创建ArrayList - new ArrayList()。
答案 1 :(得分:1)
大小设置为0,但没有明确发生的调整大小
这是实际的代码。
public void clear() {
modCount++;
// Let gc do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
请检查此link。
答案 2 :(得分:0)
大小设置为零。 arrayList.clear()
将arraylist中包含的所有对象设置为null。但是这并不能确保arraylist中包含的所有对象都是垃圾收集的。在其他地方引用的对象在收集所有引用之前都不会收集垃圾。
答案 3 :(得分:0)
减少清除后可能需要使用trimToSize()的大小。通常这不会完成,因为它没有太大的区别,除非你想要保存许多MB的数组。更常见的解决方案是在这种情况下替换ArrayList。 (我不是说那更好)