在 Java 中,Set 求交集(即两个集合中共同存在的元素)有几种常见方式。下面按实用程度和是否修改原集合来说明。
retainAll(最常用,但会修改原 Set)Set<String> set1 = new HashSet<>(Arrays.asList("A", "B", "C"));
Set<String> set2 = new HashSet<>(Arrays.asList("B", "C", "D"));
set1.retainAll(set2);
System.out.println(set1); // [B, C]
✅ 特点
set1 会被修改为交集set2 不变equals / hashCode)⚠️ 注意
Set<String> intersection = new HashSet<>(set1);
intersection.retainAll(set2);
Set<String> intersection = set1.stream()
.filter(set2::contains)
.collect(Collectors.toSet());
✅ 特点
⚠️ 注意
set2 用 HashSet 性能更好(contains 是 O(1))Set<String> intersection = new HashSet<>();
for (String s : set1) {
if (set2.contains(s)) {
intersection.add(s);
}
}
✅ 适合理解原理或特殊逻辑
Set<String> intersection = Sets.intersection(set1, set2);
✅ 返回的是视图(不拷贝,性能好)
❌ 需要引入 Guava
| 方法 | 是否修改原集合 | 推荐度 |
|---|---|---|
retainAll |
✅ 会修改 | ⭐⭐⭐ |
| Stream | ❌ 不修改 | ⭐⭐⭐⭐ |
| 手动遍历 | ❌ 不修改 | ⭐⭐ |
| Guava | ❌ 不修改 | ⭐⭐⭐⭐ |
如果你有:
LinkedHashSet)equals/hashCode可以告诉我,我可以给你更合适的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。