在Java里如何使用removeAll方法取集合差集_Java集合差集操作说明
发布时间 - 2026-01-27 00:00:00 点击率:次removeAll 方法可取差集但会原地修改原集合,需复制保留原始数据;ArrayList removeAll 性能为 O(m×n),建议将 listB 转 HashSet 优化至 O(m);注意 null 处理、自定义对象需重写 equals/hashCode;推荐 Stream+HashSet 方式避免副作用。
removeAll 方法确实能取差集,但要注意它会修改原集合
调用 listA.removeAll(listB) 后,listA 会被直接清掉所有在 listB 中存在的元素,原地变更。如果你需要保留原始 listA,必须先复制一份——比如用 new ArrayList(listA) 或 listA.stream().collect(Collectors.toList())。
ArrayList 和 LinkedList 的 removeAll 性能差异很大
ArrayList.removeAll() 在内部会遍历 listA 每个元素,并对每个元素调用 listB.contains();而 contains() 对 ArrayList 是 O(n) 查找,整体变成 O(m×n)。如果 listB 较大,建议先转成 HashSet:
SetsetB = new HashSet<>(listB); listA.removeAll(setB);
这样 contains() 降为 O(1),总时间接近 O(m)。注意:HashSet 要求元素正确实现 hashCode() 和 equals()。
removeAll 对 null 元素和自定义对象要格外小心
- 如果
listB包含null,且listA里也有null,removeAll会删掉所有null(因为null.equals(x)永远是false,但ArrayList.contains(null)是特判的) - 自定义类必须重写
equals()和hashCode(),否则即使字段值相同,removeAll也识别不出“相等”,不会删除 - 如果用了 Lombok,记得加
@EqualsAndHashCode,别只靠@Data(它默认包含,但显式声明更稳妥)
想不改原集合?别硬扛 removeAll,换 Stream 或 Guava
Java 8+ 更推荐函数式写法,语义清晰且不破坏原数据:
Listdiff = listA.stream() .filter(item -> !listB.contains(item)) .collect(Collectors.toList());
但注意:这仍会遍历 listB 多次。生产环境建议先建 Set:
SetsetB = new HashSet<>(listB); List diff = listA.stream() .filter(setB::contains) .collect(Collectors.toList());
Guava 用户可直接用 Sets.difference(setA, setB),但前提是两边都是 Set;若输入是 List,得先转,反而可能多一

removeAll 保留原集合顺序,但会删掉所有匹配项(包括重复),而 Stream 方案默认也如此;如果业务要求去重后再差集,就得先 distinct() 或用 Set 做中转。
# java
# ai
# stream
# guava
# NULL
# 对象
# 遍历
# 自定义
# 重写
# 的是
# 都是
# 如果你
# 也有
# 不出
# 用了
# 就得
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
香港服务器部署网站为何提示未备案?
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Bootstrap整体框架之CSS12栅格系统
linux top下的 minerd 木马清除方法
如何在阿里云通过域名搭建网站?
如何快速搭建高效可靠的建站解决方案?
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
Laravel如何使用.env文件管理环境变量?(最佳实践)
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Laravel如何使用Service Container和依赖注入?(代码示例)
iOS UIView常见属性方法小结
如何在宝塔面板创建新站点?
如何彻底卸载建站之星软件?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
html5的keygen标签为什么废弃_替代方案说明【解答】
浅谈Javascript中的Label语句
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
,怎么在广州志愿者网站注册?
javascript日期怎么处理_如何格式化输出
WEB开发之注册页面验证码倒计时代码的实现
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
Python图片处理进阶教程_Pillow滤镜与图像增强
七夕网站制作视频,七夕大促活动怎么报名?
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何在阿里云香港服务器快速搭建网站?
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
Laravel怎么在Controller之外的地方验证数据
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
如何为不同团队 ID 动态生成多个非值班状态按钮
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
如何在IIS中配置站点IP、端口及主机头?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
如何在阿里云高效完成企业建站全流程?
LinuxShell函数封装方法_脚本复用设计思路【教程】
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
公司网站制作价格怎么算,公司办个官网需要多少钱?
如何在IIS7上新建站点并设置安全权限?
免费视频制作网站,更新又快又好的免费电影网站?
MySQL查询结果复制到新表的方法(更新、插入)
利用JavaScript实现拖拽改变元素大小

