System.arraycopy删除数组元素本质是覆盖+截断,因Java数组长度不可变,需将目标位置后元素前移并更新有效长度。

用 System.arraycopy 删除数组元素,本质是“覆盖+截断”,不是真正删,而是把要删位置之后的元素前移,再用新长度“逻辑上”舍弃末尾冗余部分。
为什么不能直接删——数组长度不可变
Java 中普通数组创建后长度固定,无法增删元素。所谓“删除”,实际是把目标位置之后的所有元素向前复制一位,腾出空位,再配合新长度使用(比如赋给新数组或记录有效长度)。
- 原数组内存没变,只是后续元素被前移覆盖
- 最后几个“残留”元素仍存在,但不再属于有效数据范围
- 若需彻底释放,需创建更小的新数组并拷贝有效部分
单个元素删除:找准源起点和目标起点
假设要删索引为 index 的元素,长度为 len:
- 源数组起点:
index + 1(跳过要删的元素) - 目标数组起点:
index(从被删位置开始覆盖) - 拷贝长度:
len - index - 1(剩余需前移的元素个数)
示例:删除 arr[2](即第 3 个元素),原数组长度 5,则调用:
立即学习“Java免费学习笔记(深入)”;
System.arraycopy(arr, 3, arr, 2, 2);多个连续元素删除:一次拷贝搞定
要删从 from 到 to(含)的连续元素,共 count = to - from + 1 个:
- 源起点:
to + 1 - 目标起点:
from - 拷贝长度:
len - to - 1
例如删索引 1~3 共 3 个元素,原长 7,则拷贝 arr[4] 开始的 3 个元素到 arr[1] 起始位置:
安全操作建议:边界检查不能少
调用前务必校验索引有效性,避免 ArrayIndexOutOfBoundsException:
- 确保
from >= 0 && from < len - 确保
to < len && to >= from - 拷贝长度传 0 是合法的(比如删最后一个元素),无需额外分支
删完后,记得更新你的“有效长度”变量,或显式创建新数组保留结果。


















