上一篇
使用
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》中关于数据处理的建议,排序去重算法参考了经典的双指针技术。

