java中对无序数组去重并生成新数组的核心思路是利用linkedhashset保持插入顺序去重,或使用stream.distinct()方法;基本类型需先装箱,纯数组实现则用双层循环或arraylist辅助,时间复杂度较高。

Java 中对无序数组去重并生成新数组,核心思路是借助集合(如 Set)自动去重的特性,再转回数组。关键在于保留原始顺序(因原数组无序,但通常希望结果按首次出现顺序排列),同时避免修改原数组。
用 LinkedHashSet 保持插入顺序去重
LinkedHashSet 是最常用且简洁的选择:它既具备 Set 的去重能力,又按元素首次添加的顺序维护迭代顺序,完美适配“无序数组中取唯一值并保持原出现次序”的需求。
- 将原数组逐个元素加入
LinkedHashSet,重复元素自动被忽略 - 用
toArray()将集合转为新数组,类型需显式指定(如String[]::new或new String[0])
示例(以 String 数组为例):
String[] arr = {"apple", "banana", "apple", "cherry", "banana"};
Set<string> set = new LinkedHashSet(Arrays.asList(arr));
String[] uniqueArr = set.toArray(new String[0]);
// 结果:{"apple", "banana", "cherry"}
</string>
处理基本类型数组(如 int[])需转为包装类
Java 数组工具类(如 Arrays.asList())不支持基本类型数组直接转为 List,会把整个数组当作单个元素。因此需先手动转为 Integer[] 等包装类型数组。
- 可用
Stream+boxed()转换(Java 8+) - 或用循环/第三方库(如 Apache Commons Lang)辅助
推荐流式写法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
int[] arr = {1, 2, 2, 3, 1, 4};
int[] uniqueArr = Arrays.stream(arr)
.boxed()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new LinkedHashSet()),
linkedSet -> linkedSet.stream().mapToInt(Integer::intValue).toArray()
));
// 结果:{1, 2, 3, 4}
不依赖集合、纯数组实现(适合内存敏感场景)
若明确禁止使用集合类,可采用双层循环 + 标记数组方式,但时间复杂度为 O(n²),仅适用于小规模数据。
- 创建布尔数组标记是否已出现过(需知道值域范围,如全是非负整数且范围不大)
- 或用
ArrayList临时存结果,每次添加前用contains()检查(虽底层仍是线性查找,但代码更直观)
简单示例(通用型,用 ArrayList 辅助):
String[] arr = {"a", "b", "a", "c"};
List<string> list = new ArrayList();
for (String s : arr) {
if (!list.contains(s)) {
list.add(s);
}
}
String[] uniqueArr = list.toArray(new String[0]);
</string>
一行流式写法(Java 8+,推荐日常使用)
结合 Stream 和 LinkedHashSet 构造器,可写出极简版本,语义清晰且保持顺序:
String[] uniqueArr = Arrays.stream(arr)
.distinct() // 内置去重,基于 equals/hashCode,且保持顺序
.toArray(String[]::new);
注意:distinct() 在有序流中保持首次出现顺序,对普通数组流天然适用,是最简洁可靠的方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










