1. 概述
在本教程中,我们将学习如何在 Java 中移除数组中的元素。
数组在 Java 中是固定长度的数据结构,因此不像 List
那样可以动态扩容或缩容。当我们需要“移除”一个元素时,本质上是创建一个新数组,并将原数组中除目标元素外的所有元素复制进去。
我们将介绍多种方式来实现这一操作,包括使用 Apache Commons Lang 工具类、Java 标准库方法(如 Arrays.copyOf()
、System.arraycopy()
)以及 Java 8 的 IntStream
等。
2. 移除指定索引的元素
假设我们有如下数组:
如果我们想移除索引为 2 的元素,可以采用简单粗暴的方式:从索引 2 开始,把后面所有元素向前移动一位:
⚠️ 注意:这种操作不会改变数组的长度,最后一个位置将为空。由于数组是固定长度的,所以这种方式只是逻辑上“移除”了元素。
如果我们想真正改变数组长度,就需要创建一个新的数组:
3. 使用 Apache Commons Lang 移除元素
Apache Commons Lang 提供了 ArrayUtils
工具类,可以方便地操作数组。
3.1. 按索引移除元素
使用 ArrayUtils.remove()
方法,可以通过索引移除元素:
public int[] removeAnElementWithAGivenIndex(int[] array, int index) {
return ArrayUtils.remove(array, index);
}
如果要移除多个索引位置的元素,可以使用 removeAll()
方法:
public int[] removeAllElementsWithGivenIndices(int[] array, int... indices) {
return ArrayUtils.removeAll(array, indices);
}
3.2. 按元素值移除
如果我们不知道元素的索引,只知道值,可以使用 removeElement()
:
public int[] removeFirstOccurrenceOfGivenElement(int[] array, int element) {
return ArrayUtils.removeElement(array, element);
}
要移除多个相同值的元素,可以使用 removeElements()
:
public int[] removeAllGivenElements(int[] array, int... elements) {
return ArrayUtils.removeElements(array, elements);
}
4. 移除数组的最后一个元素
4.1. 使用 Arrays.copyOf()
Arrays.copyOf()
可以复制原数组并指定新长度:
public int[] removeLastElementCopyOf(int[] array) {
return Arrays.copyOf(array, array.length - 1);
}
4.2. 使用 Arrays.copyOfRange()
copyOfRange()
更加灵活,允许我们指定复制的起始和结束索引:
public int[] removeLastElementCopyOfRange(int[] array) {
return Arrays.copyOfRange(array, 0, array.length - 1);
}
4.3. 使用 System.arraycopy()
这是性能最高效的方式之一,适用于对性能敏感的场景:
public int[] removeLastElementUsingArrayCopyMethod(int[] array, int[] resultArray) {
System.arraycopy(array, 0, resultArray, 0, array.length - 1);
return resultArray;
}
4.4. 使用 IntStream.range()
Java 8 引入了 Stream API,我们可以用它来生成新的数组:
public int[] removeLastElementUsingIntStreamRange(int[] array) {
return IntStream.range(0, array.length - 1)
.map(i -> array[i])
.toArray();
}
4.5. 使用 Apache Commons Lang
也可以结合 ArrayUtils.remove()
方法移除最后一个元素:
@Test
void givenIndex_whenUsingApacheCommonsLang_thenRemoveLastElement() {
int lastElementIndex = inputArray.length - 1;
int[] modifiedArray = sut.removeAnElementWithAGivenIndex(inputArray, lastElementIndex);
assertEquals(modifiedArray.length, inputArray.length - 1);
assertFalse(ArrayUtils.contains(modifiedArray, inputArray[lastElementIndex]));
}
5. 总结
本文介绍了多种在 Java 中“移除”数组元素的方式:
✅ 推荐方式:
- 使用
Arrays.copyOf()
/copyOfRange()
:简洁易懂 - 使用
System.arraycopy()
:性能最佳 - 使用 Apache Commons Lang:代码简洁,适合已有依赖的项目
❌ 不推荐:
- 直接操作数组索引进行“原地”移除:容易出错,且无法真正缩小数组长度
⚠️ 踩坑提醒:
- 数组是固定长度结构,不能直接“删除”元素,只能创建新数组。
- 使用
ArrayUtils.removeElement()
只会移除第一个匹配项。
完整示例代码和单元测试可以参考 GitHub 仓库。