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

Har*_*Cho 0 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
Run Code Online (Sandbox Code Playgroud)

这不是浪费记忆吗?

Dav*_*ank 5

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

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