用set实现交集最高效的方式是遍历较小集合并用has()检查是否存在于较大set中,时间复杂度o(min(n,m));先转set自动去重,再通过扩展运算符或array.from转回数组。

用 Set 实现交集最高效的方式是遍历较小的集合,检查元素是否存在于较大的 Set 中。核心在于利用 Set 的 O(1) 查找性能,避免数组的 includes 或嵌套循环带来的 O(n×m) 开销。
构造两个 Set 并确保数据去重
交集操作前,先将原始数据转为 Set,自动剔除重复项,也便于后续快速查找:
const arr1 = [1, 2, 2, 3, 4];
const arr2 = [3, 4, 4, 5, 6];
const set1 = new Set(arr1); // {1, 2, 3, 4}
const set2 = new Set(arr2); // {3, 4, 5, 6}
遍历小集合 + has() 判断(推荐)
选择 size 更小的 Set 进行遍历,减少循环次数;用另一个 Set 的 has() 方法判断是否存在——这是性能最优的标准写法:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
function intersection(setA, setB) {
const [smaller, larger] = setA.size larger.has(x)));
}
const result = intersection(set1, set2); // Set {3, 4}
一行简洁写法(适合简单场景)
如果确定两个集合都不大,或追求代码简短,可用扩展运算符配合 filter:
const intersection = new Set([...set1].filter(x => set2.has(x)));
注意:该写法未做大小判断,当 set1 远大于 set2 时,会多执行很多 has() 调用,影响效率。
转换回数组或其它格式
Set 本身不支持索引和多数数组方法,如需进一步处理,可轻松转为数组:
-
[...result]→ 普通数组 -
Array.from(result)→ 同上,语义更明确 -
result.values()→ 返回迭代器,适合 for...of
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










