4

如标题所述,如果我创建一个初始容量为 500 的 ArrayList ,然后在一段时间后将其清除,它的容量仍然是 500 吗?还是我需要为此重新启动它?

4

3 回答 3

5

是的,它保留了它的容量。(至少,不在 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;
}

需要明确一点:anArrayList由一个数组支持(例如,ArrayList 的 int[]),每当您通过创建一个新数组并复制内容而超出容量时,该数组就会被扩展。清除不会(如代码中所示)创建一个新的较小数组,复制那里的东西,并破坏旧的大数组。

于 2012-11-27T10:16:48.437 回答
2

不,如果从列表中删除元素,arrayList 的容量不会改变。但是您可以使用trimToSize自己做到这一点。

通常,您无需担心容量会随着您添加更多元素而增加。担心容量的可能原因是由于频繁重新分配导致的性能。否则,您无需担心重新初始化容量。

于 2012-11-27T10:22:24.270 回答
1

在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;
    }
}
于 2012-11-27T10:44:03.667 回答