0

0

什么是集合的交集逻辑运算_retainAll方法对性能的影响分析

P粉602998670

P粉602998670

发布时间:2026-02-13 08:40:03

|

303人浏览过

|

来源于php中文网

原创

retainall() 是原地过滤操作而非纯交集函数:调用 a.retainall(b) 后 a 变为 a ∩ b,b 不变;返回 boolean 表示是否删除元素,不能用于判断交集存在;性能上 arraylist 版为 o(m×n),应将参数转 hashset 优化;hashset 版接近 o(m),更符合集合交集语义。

什么是集合的交集逻辑运算_retainall方法对性能的影响分析

retainAll() 不是“求交集函数”,而是“原地过滤”操作

它不会返回新集合,而是直接修改调用方——A.retainAll(B) 后,A 变成 A ∩ BB 完全不变。这点常被误当成纯函数用,结果在循环里反复调用导致数据意外丢失。

  • 如果后续还要用原 A,必须提前拷贝:new ArrayList(A).retainAll(B)
  • AHashSet,交集后元素顺序无意义;若是 ArrayList,则保留原始出现顺序(比如 [5, 1, 3][3, 1, 9][1, 3],不是 [3, 1]
  • 返回值是 boolean:只要删了至少一个元素就返回 true,哪怕最后只剩一个元素;完全没动也返回 false——不能靠它判断“有没有交集”,得看 A.isEmpty()A.size() > 0

ArrayList.retainAll() 性能差的根源在双重遍历 + remove开销

ArrayList 调用 retainAll(),JDK 内部会逐个调用 c.contains(e) 判断是否保留,再执行 remove()。而 remove() 是 O(n) 操作,每次删都要搬动后面所有元素;如果参数 c 是另一个 ArrayListc.contains() 又是 O(n) 线性扫描——合起来就是 O(m × n),十万级数据可能卡顿数秒。

Wordware
Wordware

Wordware是一个自然语言编程工具,使任何人都可以开发、迭代和部署有用的AI应用程序。

下载
  • 别让 cArrayListLinkedList,务必转成 HashSetnew HashSet(c)
  • 自己实现等效逻辑时,优先用 stream().filter(setC::contains).collect(...),语义清、不改原集合、还能并行
  • 真要原地改且量大?先转 HashSetA,做完交集再转回 ArrayList(但注意丢顺序)

HashSet.retainAll() 才是真正接近 O(n) 的交集操作

HashSet.retainAll() 底层是哈希定位删除,每个元素查 c 是 O(1) 平均复杂度,删本身也是 O(1),整体趋近 O(m)。而且它天然去重、无视顺序,数学意义上更贴近“集合交集”本意。

  • 如果你只关心“哪些元素共同存在”,别用 ArrayList 存中间结果,从源头就用 HashSet
  • 权限校验、标签匹配、ID 过滤等场景,Set + retainAll() 是更稳的选择
  • 注意:如果 c 是空集合,retainAll() 会清空整个调用方——这是合法行为,不是 bug

判断“是否有交集”别用 retainAll(),除非你真想改原集合

很多人用 list1.retainAll(list2); if (!list1.isEmpty()) {...} 来检测交集,这既改了 list1,又浪费了大量时间做删除动作。其实只需一次遍历 + 快速查找。

  • 推荐写法:list2.stream().collect(Collectors.toSet()); list1.stream().anyMatch(set2::contains)
  • 更省内存:把小集合转 Set,遍历大集合——谁小谁转,避免构造大哈希表
  • 如果连 Stream 都不想用,就手动循环:for (E e : smallList) if (bigSet.contains(e)) return true;
实际项目里最常踩的坑,不是不会写,而是没意识到 retainAll() 是个带副作用的破坏性操作,以及默认用 ArrayList 去扛交集计算这件事本身就不合理。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

358

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.30

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

807

2023.08.22

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

5

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

2

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

52

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

8

2026.02.12

Next.js全栈开发与SSR服务端渲染实战
Next.js全栈开发与SSR服务端渲染实战

本专题系统讲解 Next.js 框架在现代全栈开发中的应用,重点解析 SSR、SSG 与 ISR 渲染模式的原理与差异。内容涵盖路由系统、API Routes、数据获取策略、性能优化以及部署实践。通过完整项目示例,帮助开发者掌握高性能 SEO 友好的 React 全栈开发方案。

3

2026.02.12

Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

39

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号