为什么Java ArrayList的remove()方法实现不会减小内部数组数据的大小?

时间:2016-01-21 02:12:56

标签: java arrays arraylist

对于add()方法,实现方式是elementData\[\]数组的大小根据需要增长。但是,查看remove()方法时,它不会随着元素的移除而缩小大小。

我使用简单的代码进行了测试,elementData[]10开始并且增长。但是,当我使用remove()方法删除所有元素时,elementData[]的大小保持在我添加所有元素的位置。

int testSize = 10000000;

ArrayList<Integer> alist = new ArrayList<Integer>();
// size of elementData[] is 10
for(int i = 0; i < testSize; i++) {
    alist.add(i);
}
// size of elementData[] is 13845150
for(int i = alist.size()-1; i >= 0; i--) {
    alist.remove(i);
}
// size of elementData[] remains at 13845150

这不是浪费记忆吗?

1 个答案:

答案 0 :(得分:5)

首先,您应该注意,一旦创建,就无法更改数组的大小。更改ArrayList的基础数组的大小需要将数组的整个内容复制到新数组。

当你增加大小时,你必须分配一个更大的数组,否则你不能适应新的元素。 但是,从列表中删除时复制所有内容并不值得花费性能开销。记忆通常比表现低。