java中求hashset交集用retainall()、并集用addall(),但二者均修改原集合;需先复制再操作,或用stream流式处理实现不可变操作。

Java 中求两个 HashSet 的交集和并集,最常用、最直接的方式是调用 retainAll() 和 addAll() 方法,但要注意它们会**修改原集合**。如果不想改变原始数据,需要先复制一份。
交集(保留共同元素)
使用 retainAll():它会让调用方集合只保留与参数集合共有的元素。
注意:该操作会修改原集合!
- 如果想保留原始集合不变,先用
new HashSet(set1)创建副本 - 再对副本调用
retainAll(set2)
示例:
HashSet<string> set1 = new HashSet(Arrays.asList("a", "b", "c"));
HashSet<string> set2 = new HashSet(Arrays.asList("b", "c", "d"));
HashSet<string> intersection = new HashSet(set1); // 复制
intersection.retainAll(set2); // 只保留 b, c
System.out.println(intersection); // [b, c]
</string></string></string>
并集(合并所有不重复元素)
使用 addAll():将一个集合的所有元素添加到另一个集合中(HashSet 自动去重)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
同样会修改调用方集合
- 推荐先复制其中一个集合,再调用
addAll() - 顺序不影响结果(
set1.addAll(set2)和set2.addAll(set1)效果一致)
示例:
HashSet<string> set1 = new HashSet(Arrays.asList("a", "b"));
HashSet<string> set2 = new HashSet(Arrays.asList("b", "c", "d"));
HashSet<string> union = new HashSet(set1); // 复制 set1
union.addAll(set2); // 加入 set2 元素
System.out.println(union); // [a, b, c, d]
</string></string></string>
更安全的函数式写法(Java 8+)
如果追求不可变、链式或流式风格,可用 Stream 合并后收集:
- 并集:
Stream.concat(set1.stream(), set2.stream()).collect(Collectors.toSet()) - 交集:
set1.stream().filter(set2::contains).collect(Collectors.toSet())
优点是不修改原集合,语义清晰;缺点是小集合下略低效,且返回的是普通 Set(不一定是 HashSet),如需 HashSet 可显式构造:
Set<string> intersection = set1.stream()
.filter(set2::contains)
.collect(Collectors.toCollection(HashSet::new));
</string>
补充:差集(set1 中有但 set2 中没有的元素)
虽然没问,但常一起用:removeAll()
- 同样要复制:
new HashSet(set1).removeAll(set2) - 结果是
["a"](假设 set1=["a","b"], set2=["b","c"])
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










