Arrays工具类本身不能直接去重,需配合LinkedHashSet或Stream API:前者用for循环+toArray()保留顺序,后者用distinct()一行实现;基本类型数组需注意boxed转换,排序+双指针法不推荐。

用流程控制配合 Arrays 工具类本身无法直接“剔除”数组中重复元素,因为 Arrays 类(如 Arrays.asList()、Arrays.stream())不提供原地去重方法,且数组长度不可变。真正高效、简洁的做法是:借助流程控制逻辑 + 集合容器(如 LinkedHashSet)或 Java 8+ 的流式 API,再转回数组——Arrays 工具类在此主要承担“转换”和“辅助操作”角色,而非去重主体。
用 for 循环 + LinkedHashSet 保留顺序去重(推荐初学者理解)
手动遍历数组,利用 LinkedHashSet 自动去重且保持插入顺序,最后用 Arrays.copyOf() 或 toArray() 转回数组:
- 创建
LinkedHashSet,逐个add()数组元素(重复项自动被忽略) - 调用
set.toArray()得到新数组;若需指定类型(如String[]),传入带泛型的空数组,如set.toArray(new String[0]) -
Arrays类在这里只负责“类型安全的数组转换”,不参与判断逻辑
用 Stream API 一行流式去重(Java 8+,最简写法)
结合 Arrays.stream() 和 distinct(),再用 toArray() 收集:
-
String[] arr = {"a","b","a","c"};String[] unique = Arrays.stream(arr).distinct().toArray(String[]::new); -
distinct()是中间操作,底层依赖equals()和hashCode(),对基本类型数组需先用Arrays.stream()包装为对象流(如int[]要用IntStream,再 boxed) - 此方式无需显式循环,
Arrays提供了入口(stream())和出口(toArray()),流程控制由流引擎自动完成
处理基本类型数组(如 int[])的注意事项
Arrays 工具类对基本类型支持有限,不能直接用 distinct() 对 int[] 流去重:
- 错误写法:
Arrays.stream(intArr).distinct()...→ 返回的是IntStream,distinct()有效,但toArray()返回int[],没问题;但若想转成Integer[],需先boxed() - 正确示例(得
int[]):int[] uniqueInts = Arrays.stream(intArr).distinct().toArray(); - 正确示例(得
Integer[]):Integer[] boxed = Arrays.stream(intArr).distinct().boxed().toArray(Integer[]::new); - 这里
Arrays依然只做“流化”和“组装”,去重逻辑由distinct()承担
避免常见误区:别试图用 Arrays.sort() + 双指针原地“删”
有人想先排序再用双指针跳过重复,再复制到新数组——这虽可行,但:
- 改变了原始顺序(除非额外记录索引)
- 代码更长、易错,且
Arrays类未提供“跳过重复复制”的工具方法 - 相比
Stream.distinct()或LinkedHashSet,可读性与维护性更低 - 不是“配合 Arrays 工具类快速去重”的合理路径

















