最直接的方法是调用 retainall() 方法——它会修改调用方集合,只保留与参数集合共有的元素;若需保留原集合,应先复制一份,时间复杂度接近 o(n),且要求元素正确重写 equals() 和 hashcode()。

Java 中 HashSet 求两个集合交集,最直接的方法是调用 retainAll() 方法 —— 它会修改调用方集合,只保留与参数集合共有的元素,即原地完成交集操作。
使用 retainAll() 获取交集(推荐)
这是标准、高效且无需额外依赖的方式。注意:该方法会改变原始集合,如需保留原集合,应先复制一份。
- 创建副本再操作:
HashSet<string> intersection = new HashSet(set1); intersection.retainAll(set2);</string> - 结果
intersection就是 set1 ∩ set2,时间复杂度接近 O(n),底层基于哈希查找 - 确保元素正确重写了
equals()和hashCode(),否则交集可能为空或不准确
用 Stream API(Java 8+,不修改原集合)
适合函数式风格或需保持原集合不变的场景,代码更清晰但略多开销。
Set<string> intersection = set1.stream().filter(set2::contains).collect(Collectors.toCollection(HashSet::new));</string>- 本质是遍历 set1,对每个元素判断是否在 set2 中,利用 HashSet 的 O(1) 查找优势
- 若 set2 很大,建议确保它是 HashSet(而非 List),避免
contains()变成 O(n) 操作
注意事项和常见误区
交集结果取决于元素的逻辑相等性,而非引用相同。
- 自定义对象必须正确实现
equals()和hashCode();例如 Person 类按 id 判断相等,就不能只靠默认 Object 实现 -
retainAll()返回 boolean:true 表示集合内容发生改变(即有交集元素被保留),false 表示交集为空或原集合已全是交集元素 - 空集合参与运算安全:任一集合为空,结果必为空集合
不复杂但容易忽略细节。用 retainAll() 最常用,用 Stream 更灵活,核心都是依赖 HashSet 的哈希特性保证效率。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











