Java数组去重并保留原始顺序的核心方法是使用LinkedHashSet,它兼具去重与有序特性;对对象数组可直接通过Arrays.asList()转为List再构造LinkedHashSet,基本类型需先装箱或用Stream处理,自定义对象须重写equals和hashCode,小数据量也可用双重循环手动实现。

Java 中数组去重并保留原始顺序,核心思路是借助 LinkedHashSet ——它既能自动去重,又能按插入顺序维护元素。
基本方法:用 LinkedHashSet 转换
适用于对象数组(如 String[]、Integer[])或基本类型包装类数组。原理是利用 LinkedHashSet 的有序+唯一特性:
- 将数组转为 List(如 Arrays.asList()),再传入 LinkedHashSet 构造器
- 再把 Set 转回数组(通过 toArray())
示例(String 数组):
String[] arr = {"a", "b", "a", "c", "b"};
List<String> list = Arrays.asList(arr);
String[] unique = new LinkedHashSet<>(list).toArray(new String[0]);
结果:{"a", "b", "c"},顺序与首次出现一致。
立即学习“Java免费学习笔记(深入)”;
处理基本类型数组(如 int[])
基本类型数组不能直接用 Arrays.asList()(会把整个数组当一个元素)。需先转为包装类型数组,或手动遍历添加:
- 用 Stream API(Java 8+):
IntStream.of(arr).boxed().collect(Collectors.toCollection(LinkedHashSet::new)).stream().mapToInt(Integer::intValue).toArray() - 或传统循环:新建 LinkedHashSet
,遍历 int[],逐个 add,再转回 int[](需额外转回基本类型)
自定义对象去重:重写 equals() 和 hashCode()
若数组元素是自定义类(如 Person[]),必须正确实现 equals() 和 hashCode(),否则 LinkedHashSet 无法识别重复。
- 只根据业务关键字段(如 id 或 name)判断相等
- 确保两个逻辑相等的对象返回相同 hashCode
否则即使内容相同,也会被当作不同元素保留。
不依赖集合类的纯数组方案(适合小数据或教学场景)
手动双重循环 + 标记数组或动态列表:
- 创建 ArrayList 存结果,遍历原数组,对每个元素检查是否已存在(用 contains())
- 存在则跳过,否则 add
- 最后转为数组:list.toArray(new Type[0])
时间复杂度 O(n²),仅建议数据量极小或有特殊限制时使用。


















