当前位置:首页 > 后端开发 > 正文

Java数组如何去除重复元素?

使用 HashSetLinkedHashSet(保留顺序)自动去重:将数组转为集合再转回数组,Java 8+可用Stream API的 distinct()方法: Arrays.stream(arr).distinct().toArray(),传统方法可遍历数组手动过滤重复元素。

方法1:使用HashSet(推荐)

原理:利用HashSet自动去重的特性,将数组元素存入集合后再转回数组。
优点:代码简洁,时间复杂度低(O(n))。
缺点:不保证原始顺序(若需保序用LinkedHashSet)。

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Integer[] array = {1, 2, 3, 2, 4, 3}; // 示例数组
        Set<Integer> set = new HashSet<>(Arrays.asList(array));
        Integer[] uniqueArray = set.toArray(new Integer[0]);
        System.out.println(Arrays.toString(uniqueArray)); // [1, 2, 3, 4]
    }
}

方法2:Java 8 Stream API

原理:通过Stream.distinct()过滤重复元素。
优点:代码简洁,支持链式操作,适合处理对象数组。
缺点:需Java 8+环境。

Java数组如何去除重复元素?  第1张

import java.util.Arrays;
import java.util.stream.Collectors;
public class Main {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 2, 4, 3}; // 基本类型数组
        int[] uniqueArray = Arrays.stream(array).distinct().toArray();
        System.out.println(Arrays.toString(uniqueArray)); // [1, 2, 3, 4]
    }
}

方法3:遍历对比(保序)

原理:使用ArrayList动态存储非重复元素,通过遍历检查是否已存在。
优点:保留原始顺序,兼容低版本Java。
缺点:时间复杂度高(O(n²)),仅适合小规模数据。

import java.util.*;
public class Main {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 2, 4, 3};
        List<Integer> list = new ArrayList<>();
        for (int num : array) {
            if (!list.contains(num)) {
                list.add(num);
            }
        }
        int[] uniqueArray = list.stream().mapToInt(i -> i).toArray();
        System.out.println(Arrays.toString(uniqueArray)); // [1, 2, 3, 4]
    }
}

方法4:先排序后去重

原理:先排序数组,再遍历跳过重复项。
优点:空间复杂度低(O(1)),适合内存受限场景。
缺点:改变原始顺序,时间复杂度受排序影响(O(n log n))。

import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        int[] array = {1, 3, 2, 2, 4, 3};
        Arrays.sort(array); // 排序后:[1, 2, 2, 3, 3, 4]
        int index = 0;
        for (int i = 0; i < array.length; i++) {
            if (i == 0 || array[i] != array[i - 1]) {
                array[index++] = array[i];
            }
        }
        int[] uniqueArray = Arrays.copyOf(array, index);
        System.out.println(Arrays.toString(uniqueArray)); // [1, 2, 3, 4]
    }
}

方法对比与选型建议

方法 时间复杂度 空间复杂度 是否保序 适用场景
HashSet O(n) O(n) 快速去重,无需保序
Stream API O(n) O(n) Java 8+项目,代码简洁
遍历对比 O(n²) O(n) 小数据量且需兼容低版本Java
先排序后去重 O(n log n) O(1) 内存敏感且允许改变顺序

  • 推荐首选HashSetStream API(效率高、代码简洁)。
  • 需保序:用LinkedHashSet或遍历对比法。
  • 内存敏感:选排序后去重。
    实际开发中,根据数据规模、顺序要求和Java版本灵活选择方法即可。

引用说明
本文代码示例基于Oracle官方Java文档中的集合框架和Stream API实现,方法设计遵循《Effective Java》中关于数据处理的建议,排序去重算法参考了经典的双指针技术。

0