上一篇                     
               
			  Java数组如何去除重复元素?
- 后端开发
- 2025-07-05
- 3199
 使用
 
 
HashSet或
 LinkedHashSet(保留顺序)自动去重:将数组转为集合再转回数组,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+环境。

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) | 否 | 内存敏感且允许改变顺序 | 
- 推荐首选:HashSet或Stream API(效率高、代码简洁)。
- 需保序:用LinkedHashSet或遍历对比法。
- 内存敏感:选排序后去重。
 实际开发中,根据数据规模、顺序要求和Java版本灵活选择方法即可。
引用说明:
本文代码示例基于Oracle官方Java文档中的集合框架和Stream API实现,方法设计遵循《Effective Java》中关于数据处理的建议,排序去重算法参考了经典的双指针技术。

 
  
			 
			 
			 
			