HashSet不直接提供交集、并集方法,需用retainAll()求交集(修改调用方)、addAll()求并集(修改调用方)、removeAll()求差集,均建议先复制集合以保原数据;自定义对象须正确重写equals()和hashCode()。

Java 中 HashSet 本身不直接提供交集、并集的独立方法,但可以通过 retainAll() 和 addAll() 配合操作实现,关键在于理解它们对原集合的**修改行为**。
求两个 HashSet 的交集(保留共同元素)
使用 retainAll(Collection) 方法:它会**修改调用方集合**,只保留与参数集合共有的元素。
注意:操作后原集合内容会变,如需保留原始数据,应先复制一份。
- 创建副本再操作:
Set<string> intersection = new HashSet(set1); intersection.retainAll(set2);</string> - 结果
intersection就是交集,set1和set2均未被修改 - 若直接写
set1.retainAll(set2),则set1变成交集,原值丢失
求两个 HashSet 的并集(所有不重复元素)
使用 addAll(Collection) 方法:将另一个集合的所有元素添加到当前集合中(自动去重)。
立即学习“Java免费学习笔记(深入)”;
同样推荐复制操作,避免污染原始集合。
- 安全做法:
Set<string> union = new HashSet(set1); union.addAll(set2);</string> - 此时
union包含set1和set2的全部唯一元素 -
addAll()不改变参数集合,只影响调用方(这里是副本)
补充:差集(set1 中有但 set2 中没有的元素)
用 removeAll(Collection) 实现:
Set<string> diff = new HashSet(set1); diff.removeAll(set2);</string>- 结果即为 set1 对 set2 的相对差集
小提醒:类型和 null 安全
HashSet 允许存 null,且要求元素正确重写 equals() 和 hashCode()。如果自定义对象作元素,务必确保这两个方法逻辑一致,否则交/并集结果可能不符合预期。
不复杂但容易忽略。


















