Java中数组无法真正删除元素,只能通过覆盖和移动模拟:将待删位置后所有元素前移一位,末尾可置默认值或维护有效长度。

Java 中数组是固定长度的,无法真正“删除”元素,但可以通过覆盖和移动数据来模拟删除指定位置元素并前移后续数据的效果。
手动移动后续元素(推荐)
这是最直接、最常用的方法:将待删除位置之后的所有元素依次向前移动一位,再忽略最后一个位置(逻辑上视为已删除)。
- 假设原数组为 int[] arr = {1, 2, 3, 4, 5},要删除索引 2(即元素 3)
- 从索引 3 开始,逐个将
arr[i]赋值给arr[i-1],直到倒数第二个元素 - 最后可选:将末尾设为默认值(如
0或null),或仅维护有效长度(用单独变量记录)
示例代码:
public static void removeAt(int[] arr, int index) {
if (arr == null || index < 0 || index >= arr.length) {
throw new IllegalArgumentException("索引越界");
}
// 将 index+1 及之后的元素前移
for (int i = index; i < arr.length - 1; i++) {
arr[i] = arr[i + 1];
}
// 可选:清空最后一个位置(非必须,但更清晰)
arr[arr.length - 1] = 0;
}使用 System.arraycopy 高效移动
当数组较大时,System.arraycopy 比循环更快,底层由 JVM 优化实现。
立即学习“Java免费学习笔记(深入)”;
- 把
arr[index + 1]开始的子数组复制到arr[index]开始的位置 - 复制长度为
arr.length - index - 1 - 同样需手动处理末尾(如置零)
示例:
System.arraycopy(arr, index + 1, arr, index, arr.length - index - 1); arr[arr.length - 1] = 0; // 清空冗余位
注意:数组长度不会改变
无论哪种方式,Java 原生数组的 length 属性始终不变。所谓“删除”,只是让逻辑上有效数据变少。
- 若需真正缩短容器,应改用
ArrayList,调用remove(int index)即可自动前移且长度更新 - 如果坚持用数组,建议额外维护一个
size变量表示当前有效元素个数 - 对引用类型数组,前移后记得将原末尾位置设为
null,避免内存泄漏
替代方案:用 ArrayList 更自然
除非有特殊性能或兼容要求,日常开发中优先考虑 ArrayList:
ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); list.remove(2); // 删除索引 2 的元素(即 3),后续自动前移,size 实时更新
它内部就是基于数组实现,但封装了扩容、缩容、移动等细节,语义更清晰、不易出错。


















