Java数组求交集无通用最优解,效率取决于数据规模、是否允许修改原数组、是否需去重及是否要求保持顺序,应依具体场景选择合适方法。

Java 中数组求交集的效率取决于数据规模、是否允许修改原数组、是否需要去重以及是否要求保持顺序。没有“银弹”方案,但可以根据场景选择合适的方法。
小数组(
适合大多数日常场景,代码简洁、时间复杂度 O(m + n),空间换时间。
- 把第一个数组转为 HashSet(自动去重,查找 O(1))
- 遍历第二个数组,对每个元素检查是否存在于 HashSet 中
- 存在则加入结果列表(如 ArrayList),避免重复可再用一个 Set 记录已添加元素
示例(保留重复?不保留;顺序?按 secondArray 出现顺序):
List<Integer> intersection = new ArrayList<>();
Set<Integer> set1 = new HashSet<>(Arrays.asList(arr1));
Set<Integer> added = new HashSet<>(); // 防止结果重复
for (int x : arr2) {
if (set1.contains(x) && added.add(x)) { // add() 返回 true 表示首次加入
intersection.add(x);
}
}
大数组且已排序:双指针法(零额外空间,O(m + n))
当两个 int[] 或 Integer[] 已升序排列时,无需哈希结构,节省内存,稳定高效。
立即学习“Java免费学习笔记(深入)”;
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 用两个下标 i、j 分别指向两数组开头
- 比较 arr1[i] 和 arr2[j]:
相等 → 加入结果,i++、j++
arr1[i] 小 → i++
arr2[j] 小 → j++ - 任一下标越界即结束
注意:天然去重需在相等时跳过后续相同元素(加 while 循环)。
需保持原始顺序 + 去重:用 LinkedHashSet 控制插入顺序
如果交集结果要按第一个数组中出现的顺序排列,且每个元素只出现一次:
- 将第二个数组转为 HashSet(用于 O(1) 查找)
- 遍历第一个数组,遇到在 set2 中存在的元素,放入 LinkedHashSet
- 最后转为 List 或数组 —— 此时顺序与 arr1 一致,且无重复
这样既保证了顺序性,又避免了反复扫描第二个数组。
原始类型数组(如 int[]):避免装箱开销
对 int[]、long[] 等,直接用 Arrays.stream(...).boxed() 会触发大量自动装箱,影响性能。
- 小规模:仍可用 HashSet
,影响不大 - 大规模:考虑使用第三方库如 Trove(TIntHashSet)或 Eclipse Collections(IntHashSet)
- 或手动实现简单哈希逻辑(仅限极端性能敏感场景)
Java 17+ 可结合 Stream + distinct(),但注意 boxed 流的开销,适合可读性优先、性能非瓶颈的场合。

















