【发布时间】:2012-11-27 10:07:14
【问题描述】:
正如标题所提到的,如果我创建一个初始容量为 500 的 ArrayList,然后在一段时间后将其清除,它的 容量 仍然是 500 吗?还是我需要为此重新初始化它?
【问题讨论】:
正如标题所提到的,如果我创建一个初始容量为 500 的 ArrayList,然后在一段时间后将其清除,它的 容量 仍然是 500 吗?还是我需要为此重新初始化它?
【问题讨论】:
是的,它保留了它的容量。 (至少,不在 Oracle VM 的实现中):
/**
* Removes all of the elements from this list. The list will
* be empty after this call returns.
*/
public void clear() {
modCount++;
// Let gc do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
要明确一点:ArrayList 由一个数组支持(例如 ArrayList 的 int[]),并且每当您通过创建新数组并复制内容而超出容量时,该数组就会扩展。清除不会(如代码所示)创建一个新的更小的数组,复制那里的东西,并销毁旧的大数组。
【讨论】:
不,如果从列表中删除元素,arrayList 的容量不会改变。但您可以使用 trimToSize 自行完成。
一般来说,您无需担心容量会随着您添加更多元素而增加。担心容量的可能原因是由于频繁重新分配导致的性能。否则,您无需担心重新初始化容量。
【讨论】:
在Capacity of ArrayList的帮助下,我发现容量没有被重置。找到示例代码:
import java.lang.reflect.Field;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
try {
ArrayList<Object> al = new ArrayList<Object>(500);
System.out.println(getCapacity(al));
for (int i = 0; i < 550; i++) {
al.add(new Object());
}
System.out.println(getCapacity(al));
al.clear();
System.out.println(getCapacity(al));
} catch (Exception ex) {
ex.printStackTrace();
}
}
static int getCapacity(ArrayList<?> l) throws Exception {
Field dataField = ArrayList.class.getDeclaredField("elementData");
dataField.setAccessible(true);
return ((Object[]) dataField.get(l)).length;
}
}
【讨论】: