HashSet去重最快但不保序,LinkedHashSet兼顾去重与原序,双层循环法无需集合类但时间复杂度O(n²)。

Java 对无序数组去重,核心在于不依赖原始顺序是否保留。不同需求对应不同方法,效率和实现复杂度差异明显。
用 HashSet 去重(最常用,不保序)
利用 HashSet 不允许重复、插入快(O(1) 平均)的特性,适合只要求结果唯一、不关心顺序的场景。
注意:基本类型如 int[] 需先转为包装类(Integer[]),再进集合;最后再转回基本数组。
- 代码简洁,时间复杂度 O(n),空间复杂度 O(n)
- 输出顺序是哈希散列决定的,与原数组无关
- 适用于统计类、中间计算等对顺序无要求的场合
用 LinkedHashSet 去重(保序推荐)
它既去重,又按元素**首次出现的顺序**记录插入位置,完美解决“无序输入但需保持原序”这一常见需求。
立即学习“Java免费学习笔记(深入)”;
- 遍历原数组一次,逐个 add,自动跳过重复项
- 最终转成数组时顺序不变,比如 [3,1,2,1,3] → [3,1,2]
- 性能略低于 HashSet,但差别极小,生产环境首选保序方案
纯数组双层循环法(不用集合类)
不引入任何 java.util.* 类,仅靠两个 for 循环判断是否已存在,适合教学、受限环境或面试手写。
- 外层取当前元素,内层检查它在“已确认唯一”的部分是否出现过
- 需要预分配临时数组(长度同原数组),再用计数器截取有效段
- 时间复杂度 O(n²),只建议用于小数据量(如
Stream.distinct()(Java 8+ 简洁写法)
一行代码搞定,语义清晰,底层仍基于 LinkedHashSet 实现保序去重。
- Arrays.stream(arr).distinct().toArray()
- 仅支持基本类型流(如 IntStream)或引用类型数组;int[] 可直接用,String[] 也天然支持
- 不可修改原数组,返回新数组,函数式风格更易读


















