ArrayList的remove方法通过System.arraycopy将被删元素后所有元素前移,并将原末尾引用设为null以助GC;不自动缩容,仅size减1。

ArrayList 的 remove 方法在删除元素时,会将被删位置之后的所有元素向前移动一位,并把原数组末尾的引用设为 null,以帮助垃圾回收。
元素平移:用 System.arraycopy 高效拷贝
ArrayList 内部使用 Object 数组存储元素。当调用 remove(int index) 时,它不会逐个赋值,而是调用底层的 System.arraycopy 进行批量复制:
- 源数组:从
index + 1开始(即被删元素后一个) - 目标数组:从
index开始(覆盖被删位置) - 拷贝长度:
size - index - 1(剩余要前移的元素个数)
例如,列表 [A, B, C, D] 中 remove(1)(删 B),就将 C, D 向前挪到索引 1 和 2 的位置,结果变成 [A, C, D, D](暂未清理尾部)。
清空尾部引用:显式赋 null 防止内存泄漏
平移完成后,原末尾位置(即 size - 1)仍保留着旧引用(如上面例子中的 D)。ArrayList 会主动执行:
elementData[--size] = null;
这一步很关键——它让原末尾元素的引用变为 null,解除对对象的强引用,使对象可被 GC 回收。若不这么做,即使逻辑上已“删除”,该对象仍被数组持有,可能造成内存泄漏(尤其存的是大对象或有外部引用时)。
注意 remove(Object) 的额外逻辑
如果是按值删除(remove(Object o)),ArrayList 会先遍历找匹配项,找到第一个就调用上述下标删除逻辑;没找到则返回 false。整个过程同样包含平移 + 尾部置 null,只是多了一次查找开销。
扩容/缩容与 remove 无关
需要澄清一点:remove 不会自动缩容(即不减少底层数组长度)。数组容量(capacity)保持不变,只有逻辑大小(size)减 1。除非手动调用 trimToSize(),否则空间不会返还给 JVM。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











