hashset集合运算高效简洁:交集用retainall()保留共同元素(需复制原集合防修改),并集用addall()合并去重,差集用removeall()移除另一集合元素;均推荐小集合调用方法以提升性能。

Java 中用 HashSet 做集合运算(交集、并集、差集)既高效又简洁,核心在于利用其 O(1) 平均时间复杂度的查找和修改能力,配合 retainAll()、addAll() 和 removeAll() 这三个原生方法——它们内部已针对 HashSet 优化,无需手动遍历。
交集:用 retainAll() 保留共同元素
该方法会**直接修改调用方集合**,只保留它与参数集合都包含的元素。注意:原始集合会被改变,如需保留原集合,应先复制。
- 确保两个集合都是
HashSet或其他基于哈希的实现,避免因重写equals/hashCode不当导致匹配失败 - 推荐先让较小的集合调用
retainAll(),减少迭代次数(例如:小集合 retain 大集合,比反过来快) - 示例:// setA = {1,2,3}, setB = {2,3,4}
HashSet<integer> intersection = new HashSet(setA);<br> intersection.retainAll(setB); // 结果为 {2, 3}</integer>
并集:用 addAll() 合并去重
addAll() 会将参数集合中所有不在当前集合中的元素加入,天然满足并集“不重复”的要求。同样会修改原集合。
- 若想不破坏原集合,可新建一个
HashSet并以其中一个集合为初始容量构造(提升性能) - 构造时传入初始容量(如
new HashSet(Math.max(a.size(), b.size()))),避免多次扩容 - 示例:
HashSet<integer> union = new HashSet(setA);<br> union.addAll(setB); // {1,2,3,4}</integer>
差集(A − B):用 removeAll() 移除另一集合元素
计算 A 对 B 的差集,即 A 中有、B 中没有的元素。调用 setA.removeAll(setB) 即可,同样原地修改 setA。
- 与交集类似,建议用元素更少的集合作为被减数(即小集合 removeAll 大集合),可显著减少哈希查找次数
- 若需 A−B 且保留 A 原始状态,务必先复制:
new HashSet(setA).removeAll(setB) - 注意:
removeAll内部会对setB每个元素调用contains,所以setB也必须是哈希类集合才能保证整体 O(n) 效率
只要数据类型正确重写了 equals 和 hashCode,这三个操作平均时间复杂度均为 O(n),空间上也只需额外 O(min(m,n))(复制时)。不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











