最推荐用HashSet边遍历边检查,时间复杂度O(n)、逻辑清晰;其次可排序后比较相邻元素,空间省但会修改原数组且耗时O(n log n);特定范围可用布尔数组标记;双重循环等O(n²)方法仅适用于极小数据。

最常用也最推荐的方式是用 HashSet 边遍历边检查。它时间效率高、逻辑清晰,适合绝大多数场景。
用 HashSet 判断(推荐)
利用 HashSet 不允许重复的特性,遍历时尝试添加元素,add() 返回 false 就说明已存在。
- 代码简洁:遍历一次,平均时间复杂度 O(n),空间复杂度 O(n)
- 适用于整数、字符串等基本类型或正确重写了 equals/hashCode 的对象
- 示例逻辑:
Set<Integer> seen = new HashSet<>();
for (int num : array) {
if (!seen.add(num)) return true; // 发现重复
}
return false;
排序后比较相邻元素
先调用 Arrays.sort() 排序,再顺序扫描,看是否有连续相等的值。
- 优点是空间占用少(原地操作),不需要额外集合
- 缺点是会改变原数组顺序,且排序本身耗时 O(n log n)
- 适合对内存敏感、且允许修改输入的场景
用布尔数组标记(限特定范围)
仅适用于数组元素值都在 [0, n-1] 范围内的情况(n 是数组长度)。
立即学习“Java免费学习笔记(深入)”;
- 创建 boolean[n] visited,以元素值为下标做标记
- 遇到 visited[num] 已为 true,就说明重复
- 速度快、空间固定,但适用范围窄,超出范围会 ArrayIndexOutOfBoundsException
其他方式(慎用)
比如双重 for 循环逐个比对,或用 indexOf/lastIndexOf 判断——这些方法时间复杂度都是 O(n²),只适合极小数组或教学演示。
- 嵌套循环易写错,大数据量下明显卡顿
- indexOf 等方法在 String 或 List 中可用,但对原始 int[] 需先转成包装类型,额外开销大


















