最直接高效的方式是使用 retainall() 方法,它会修改调用方集合为交集,若需保留原集合应先复制;stream api 方式不修改原集合但性能略低,两者均要求元素正确实现 equals() 和 hashcode()。

Java 中求两个 HashSet 的交集,最直接、高效的方式是使用 retainAll() 方法。
使用 retainAll() 获取交集(推荐)
该方法会**修改调用方集合**,只保留它与参数集合中都存在的元素。注意:原始集合会被改变,如需保留原集合,应先复制一份。
- 调用
set1.retainAll(set2)后,set1就变为两者的交集 - 若不想修改原集合,可先创建副本:
HashSet<string> intersection = new HashSet(set1); intersection.retainAll(set2);</string> - 时间复杂度接近 O(n),底层基于哈希查找,效率高
用 Stream API 实现(不修改原集合)
适合函数式风格或需链式操作的场景,但性能略低于 retainAll()(尤其数据量大时)。
Set<string> intersection = set1.stream().filter(set2::contains).collect(Collectors.toSet());</string>- 注意:
set2::contains在HashSet中是 O(1) 平均复杂度,整体为 O(n) - 结果是新集合,
set1和set2均不受影响
注意事项与常见误区
交集操作依赖元素的 equals() 和 hashCode() 正确实现。若自定义对象未重写这两个方法,可能导致逻辑错误。
- 确保元素类型已正确定义相等性(如 String、Integer 默认支持;自定义类需重写
equals和hashCode) -
retainAll()返回boolean:若集合因本次操作发生改变则返回true,否则为false(可用于判断是否有交集) - 空集合参与运算结果为空;任一集合为
null会抛出NullPointerException,调用前建议判空
不复杂但容易忽略细节,按需选择是否修改原集合即可。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











