Java数组去重需借助集合(如LinkedHashSet)或Stream API,前者保持插入顺序,后者适用于基本类型;自定义对象须重写equals()和hashCode(),空值与多维数组需特殊处理。

Java 中数组去重并保留唯一数据,核心思路是借助集合(如 LinkedHashSet)自动去重且保持插入顺序,再转回数组。原始数组本身不支持直接去重操作,必须通过中间容器处理。
使用 LinkedHashSet 保持顺序去重(推荐)
LinkedHashSet 能同时满足「去重」和「保持原始顺序」两个关键需求,适合大多数场景。
- 适用于基本类型包装类(
Integer、String等)或自定义对象(需正确重写equals()和hashCode()) - 对
int[]这类基本类型数组,需先转为Integer[];可借助Arrays.stream()+boxed() - 示例(字符串数组):
String[] arr = {"a", "b", "a", "c"};
String[] unique = new LinkedHashSet(Arrays.asList(arr)).toArray(new String[0]);
基本类型数组(如 int[])的处理方法
基本类型数组不能直接用泛型集合,需先装箱,去重后再拆箱(若仍需 int[])。
- 用 Stream API(Java 8+):
int[] arr = {1, 2, 1, 3};
int[] unique = Arrays.stream(arr)
.distinct()
.toArray(); -
distinct()是 Stream 的内置去重方法,底层基于LinkedHashSet,简洁高效 - 注意:该方式仅适用于一维基本类型数组,且要求 Java 8 及以上
手动遍历 + List 判断(兼容低版本,可控性强)
不依赖 Stream 或高级集合时,可用传统循环配合 ArrayList 和 contains() 实现。
立即学习“Java免费学习笔记(深入)”;
- 适合需要自定义去重逻辑(例如忽略大小写、按某字段比较)的场景
- 性能略低(
contains()时间复杂度 O(n)),小数据量无感,大数据量建议换用 Set - 示例:
List<String> list = new ArrayList<>();
for (String s : arr) {
if (!list.contains(s)) {
list.add(s);
}
}
String[] unique = list.toArray(new String[0]);
注意事项与常见误区
去重结果是否符合预期,取决于数据类型和比较方式。
- 自定义对象数组去重,必须重写
equals()和hashCode(),否则默认按引用比较,所有对象都视为不同 -
HashSet会打乱顺序,如需顺序请用LinkedHashSet或TreeSet(后者按自然序/比较器排序,非插入序) - 空数组、
null元素需提前判空,避免NullPointerException - 多维数组去重需先扁平化或定义“重复”的具体含义(整行相同?某列相同?)


















