对于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
这不是浪费记忆吗?
答案 0 :(得分:5)
首先,您应该注意,一旦创建,就无法更改数组的大小。更改ArrayList
的基础数组的大小需要将数组的整个内容复制到新数组。
当你增加大小时,你必须分配一个更大的数组,否则你不能适应新的元素。 但是,从列表中删除时复制所有内容并不值得花费性能开销。记忆通常比表现低。