1. 概述

在本教程中,我们将学习如何在 Java 中移除数组中的元素

数组在 Java 中是固定长度的数据结构,因此不像 List 那样可以动态扩容或缩容。当我们需要“移除”一个元素时,本质上是创建一个新数组,并将原数组中除目标元素外的所有元素复制进去。

我们将介绍多种方式来实现这一操作,包括使用 Apache Commons Lang 工具类、Java 标准库方法(如 Arrays.copyOf()System.arraycopy())以及 Java 8 的 IntStream 等。


2. 移除指定索引的元素

假设我们有如下数组:

Array simple

如果我们想移除索引为 2 的元素,可以采用简单粗暴的方式:从索引 2 开始,把后面所有元素向前移动一位:

Array rm

⚠️ 注意:这种操作不会改变数组的长度,最后一个位置将为空。由于数组是固定长度的,所以这种方式只是逻辑上“移除”了元素。

如果我们想真正改变数组长度,就需要创建一个新的数组:

Array rm common


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 仓库


原始标题:Removing an Element from an Array in Java | Baeldung