核心概念
HashSet 基于 HashMap 实现,存储不重复元素,提供 O(1) 的 add/remove/contains 操作。
集合运算实现
Set<String> onlyA = new HashSet<>(setA);
onlyA.removeAll(setB); // 差集 A - B
Set<String> onlyB = new HashSet<>(setB);
onlyB.removeAll(setA); // 差集 B - A| 运算 | 方法 | 说明 |
|---|---|---|
| 差集 A-B | a.removeAll(b) | 从 a 中移除所有在 b 中的元素(原地修改) |
| 并集 | a.addAll(b) | 将 b 中元素加入 a(原地修改) |
| 交集 | a.retainAll(b) | 仅保留 b 中也存在的元素(原地修改) |
重要细节
removeAll是原地操作,先new HashSet<>(original)拷贝一份再操作- 时间复杂度 O(n),其中 n 是调用者集合的大小
- 从 Java 8+ 可用 Stream API:
setA.stream().filter(x -> !setB.contains(x)).collect(...)
大文件优化
- 使用
BufferedReader逐行读取,避免一次性加载全部到字符串 - 如果内存紧张,考虑分批处理或外部排序
面试要点
HashSetvsTreeSet:HashSet O(1) 无序,TreeSet O(log n) 有序removeAll等价于Set.difference,底层遍历调用 contains- 注意拷贝原集合,不要原地修改入参