使用hashmap统计频次并筛选value>1的key是最常用方法,适用于整型、字符串等类型;stream方式简洁但顺序不保证;基本类型需装箱处理,大数组可选第三方原生库。

要找出 Java 数组中所有重复出现的元素,核心思路是统计每个元素的出现次数,再筛选出频次大于 1 的那些。关键在于选择合适的数据结构(如 HashMap)来高效计数,同时注意处理基本类型数组与引用类型数组的差异。
用 HashMap 统计频次并提取重复项
这是最常用、清晰且通用的方法,适用于整型、字符串等可作为 Map 键的类型:
- 遍历数组,以元素为 key、出现次数为 value 存入
HashMap - 再次遍历 Map 的 entrySet,收集 value > 1 的 key
- 结果可存入
List或直接打印;若需去重输出(每个重复元素只列一次),此方式天然满足
示例(int 数组):
int[] arr = {1, 2, 3, 2, 4, 3, 5};
Map<integer integer> countMap = new HashMap();
for (int num : arr) {
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
}
List<integer> duplicates = new ArrayList();
for (Map.Entry<integer integer> entry : countMap.entrySet()) {
if (entry.getValue() > 1) {
duplicates.add(entry.getKey());
}
}
// duplicates = [2, 3]
</integer></integer></integer>
使用 Java 8 Stream 简洁实现
适合代码简洁性优先、且对性能要求不极端的场景:
- 先转为流,用
Collectors.groupingBy按元素分组并计数 - 再用
filter筛选计数值 > 1 的 entry,映射出 key - 注意:返回的是
Set或List,顺序不保证(除非用LinkedHashMap作下游收集器)
示例(String 数组):
String[] arr = {"a", "b", "c", "a", "b"};
Set<string> duplicates = Arrays.stream(arr)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet().stream()
.filter(entry -> entry.getValue() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toSet());
// duplicates 可能是 ["a", "b"]
</string>
处理基本类型数组的注意事项
Java 中 int[]、double[] 等不能直接用泛型集合,需做装箱转换:
- 避免手动循环装箱,推荐用
Arrays.stream(arr).boxed()转成IntStream再装箱 - 若数组极大,频繁装箱可能带来开销;此时可考虑用
Trove或FastUtil等第三方原生集合库 - 对于排序后查找重复(如先
Arrays.sort()),仅适合只需判断是否存在重复、或允许改变原数组顺序的场景,无法一次性列出所有重复值
去重结果与保留原始顺序的选择
默认 HashMap 不保证插入顺序,若需按首次重复出现的顺序输出,可用 LinkedHashMap 替代:
- 声明时用
new LinkedHashMap() - 在第二次遍历时,entrySet 的迭代顺序即为元素首次被 put 进来的顺序
- 如果希望按数组中“第一次发现重复”的位置排序,则需额外记录索引,逻辑更复杂,一般需求中较少见
不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











