java中一维数组无法真正删除元素,只能通过逻辑移除模拟:①用新数组复制保留元素;②原地双指针覆盖后截断;③转arraylist调用remove。推荐arraylist,但理解数组手动处理对底层和面试有益。

Java 中一维数组本身是固定长度的,无法真正“删除”元素,但可以通过逻辑移除(跳过、覆盖、截断)配合新数组或集合来模拟删除效果。实际开发中更推荐使用 ArrayList,但理解数组层面的手动处理逻辑对底层思维和面试题很有帮助。
用新数组实现“删除”(推荐用于明确删除位置或条件)
核心思路:遍历原数组,将**不需要删除的元素**依次复制到新数组中,最后返回新数组。
- 适合已知删除索引(如删第3个)、或满足某条件(如删所有负数)的场景
- 需提前统计保留元素个数,或先用集合暂存再转数组,避免多次扩容
- 示例:删除值为 5 的所有元素
int[] arr = {1, 5, 3, 5, 7, 5};
// 第一步:统计非5的元素个数
int count = 0;
for (int x : arr) if (x != 5) count++;
// 第二步:创建新数组并填充
int[] newArr = new int[count];
int idx = 0;
for (int x : arr) {
if (x != 5) newArr[idx++] = x;
}
// newArr = [1, 3, 7]
原地覆盖 + 截断(节省空间,适合删除少量元素)
不新建数组,而是用双指针思想:一个读指针遍历,一个写指针记录应保留位置,最后通过 Arrays.copyOf 截取有效段。
- 写指针只在遇到保留元素时才移动,天然实现“覆盖跳过”
- 最终用
Arrays.copyOf(arr, writeIndex)得到逻辑删除后的数组 - 注意:原数组内容未清空,只是引用变短;适合对内存敏感的场景
int[] arr = {2, 0, 4, 0, 6};
int write = 0;
for (int read = 0; read
转为 ArrayList 再操作(最灵活,日常首选)
数组转 ArrayList 后可直接用 removeIf、remove(Object) 或迭代器安全删除,语义清晰、不易出错。
-
removeIf(predicate)一行删满足条件的所有元素(JDK 8+) - 用迭代器
iterator.remove()避免ConcurrentModificationException - 操作完可转回数组:
list.toArray(new Integer[0])
Integer[] arr = {1, 2, 3, 2, 4};
List<integer> list = new ArrayList(Arrays.asList(arr));
list.removeIf(x -> x == 2); // 删除所有2
arr = list.toArray(new Integer[0]); // [1, 3, 4]
</integer>
注意事项与避坑点
数组删除本质是“逻辑剔除”,不是原地擦除。务必区分清楚目标:
- 若只是临时跳过某些元素做计算,无需生成新数组,循环中加
continue即可 - 不要在 for-i 循环中边遍历边
System.arraycopy左移——易越界且效率低 - 基本类型数组(如
int[])不能直接转ArrayList<integer></integer>,需手动包装或用Stream(Arrays.stream(arr).boxed().collect(...)) - 高频增删场景,坚决放弃数组,改用
ArrayList或LinkedList
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











