java数组长度固定,无法真正删除元素:①创建新数组复制非目标元素;②改用arraylist自动处理增删;③原地设默认值+计数器伪删除;注意边界检查及基本类型转包装类。

Java 中数组长度固定,无法真正“删除”元素,只能通过创建新数组、移动元素或使用集合类来实现逻辑上的删除效果。
使用新数组复制(推荐用于基本类型或简单场景)
手动创建一个比原数组小 1 的新数组,将指定索引前后的元素分别复制过去:
- 检查索引是否越界(0 ≤ index ),否则抛出 IllegalArgumentException
- 用 Arrays.copyOf() 和 System.arraycopy() 高效拼接两段:索引前部分 + 索引后部分
示例代码:
public static int[] removeElementAt(int[] arr, int index) {
if (arr == null || index = arr.length) {
throw new IllegalArgumentException("Invalid index");
}
int[] result = new int[arr.length - 1];
System.arraycopy(arr, 0, result, 0, index); // 复制前半段
System.arraycopy(arr, index + 1, result, index, arr.length - index - 1); // 复制后半段
return result;
}
改用 ArrayList(推荐用于频繁增删的业务逻辑)
数组不适合动态修改,ArrayList 内部基于数组但封装了自动扩容/缩容和元素移动逻辑:
- 调用 list.remove(index) 即可直接删除指定位置元素,返回被删对象
- 底层自动将后续元素前移,并减少 size,无需手动管理长度
- 若原数据来自数组,可用 new ArrayList(Arrays.asList(array)) 转换(注意:基本类型数组需先转为包装类数组)
原地“伪删除”(仅适用于允许占位的场景)
不改变数组长度,仅将目标位置设为默认值或特殊标记:
- 对 int[] 可赋值为 0;String[] 可赋值为 null
- 需额外维护一个有效元素计数器,或配合其他逻辑识别“已删除”状态
- 适合缓存、池化等对内存敏感且删除操作较少的场景
注意事项
避免常见误区:
- 不要试图用 arr[index] = null(对基本类型编译不通过)
- 不要忽略边界检查,否则运行时抛 ArrayIndexOutOfBoundsException
- 原始类型数组(如 int[])不能直接转成 ArrayList
,需先用 Stream 或循环包装
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











