Java retainAll() 详解
在 Java 中,retainAll() 是 Collection 接口(List、Set 等集合类实现该接口)的一种方法,用于保留集合中与指定集合交集的元素,删除其他所有元素。
以下是对 retainAll() 方法的详细讲解。
1. 方法定义
方法签名
boolean retainAll(Collection<?> c)
参数
c:一个集合,用于指定要保留的元素。
返回值
- 返回一个
boolean值:true:如果集合内容因调用此方法而改变。false:如果集合内容没有改变(即调用此方法前后集合中的元素相同)。
2. 功能描述
retainAll()方法会将调用该方法的集合(假设为A)中的所有元素与参数集合(假设为B)进行比较,保留两者交集的元素。- 如果
A中的元素不在B中,它们会被移除。 - 参数集合
B不会被修改。
3. 使用示例
基本用法
import java.util.ArrayList;
import java.util.Arrays;public class RetainAllExample {public static void main(String[] args) {ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));ArrayList<Integer> list2 = new ArrayList<>(Arrays.asList(3, 4, 5, 6, 7));// 保留 list1 和 list2 的交集list1.retainAll(list2);System.out.println(list1); // 输出:[3, 4, 5]}
}
返回值示例
import java.util.ArrayList;
import java.util.Arrays;public class RetainAllExample {public static void main(String[] args) {ArrayList<String> list1 = new ArrayList<>(Arrays.asList("A", "B", "C"));ArrayList<String> list2 = new ArrayList<>(Arrays.asList("B", "C"));boolean isModified = list1.retainAll(list2);System.out.println(isModified); // 输出:true,因为 list1 发生了改变System.out.println(list1); // 输出:[B, C]}
}
4. 常见场景
场景 1:找出两个集合的交集
使用 retainAll() 可以快速找到两个集合的交集:
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3, 4));
Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5, 6));set1.retainAll(set2);System.out.println(set1); // 输出:[3, 4]
场景 2:从集合中删除不需要的元素
通过与一个已知集合比较,保留需要的元素,其余元素被删除:
List<String> fruits = new ArrayList<>(Arrays.asList("Apple", "Banana", "Mango", "Orange"));
List<String> preferredFruits = Arrays.asList("Apple", "Orange");fruits.retainAll(preferredFruits);System.out.println(fruits); // 输出:[Apple, Orange]
5. 注意事项和常见问题
注意事项
-
不支持
null集合:- 如果参数集合为
null,调用retainAll()会抛出NullPointerException。List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3)); list.retainAll(null); // 抛出 NullPointerException
- 如果参数集合为
-
原集合会被修改:
- 调用此方法后,原集合的内容会被更改,仅保留交集元素。
-
参数集合不可修改:
retainAll()不会修改参数集合。
常见问题
-
空交集:
如果两个集合没有交集,则调用retainAll()后,原集合会变为空。List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3)); List<Integer> list2 = new ArrayList<>(Arrays.asList(4, 5, 6));list1.retainAll(list2);System.out.println(list1); // 输出:[] -
顺序保留:
如果使用List(如ArrayList),retainAll()保留交集时,元素的顺序按照原集合的顺序。List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4)); List<Integer> list2 = new ArrayList<>(Arrays.asList(4, 3));list1.retainAll(list2);System.out.println(list1); // 输出:[3, 4]
6. 内部原理
执行流程
- 遍历调用
retainAll()的集合(如list1)。 - 对于每个元素,检查它是否存在于参数集合中(如
list2)。 - 如果不存在,移除该元素。
- 返回
true,如果至少有一个元素被移除;否则返回false。
效率
- 取决于参数集合的类型:
- 如果参数集合是一个
HashSet,retainAll()的性能较好,因为HashSet提供了快速的查找操作(O(1))。 - 如果参数集合是一个
List,性能可能会较低,因为查找操作需要线性时间(O(n))。
- 如果参数集合是一个
7. 与其他方法的区别
removeAll()
- 区别:
removeAll()是删除当前集合中与指定集合交集的元素,而retainAll()是保留交集元素。 - 示例:
List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4)); List<Integer> list2 = new ArrayList<>(Arrays.asList(3, 4, 5));// removeAll 删除交集 list1.removeAll(list2); System.out.println(list1); // 输出:[1, 2]// retainAll 保留交集 list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4)); list1.retainAll(list2); System.out.println(list1); // 输出:[3, 4]
8. 总结
| 方法 | 描述 |
|---|---|
| 作用 | 保留集合中与指定集合交集的元素,其余元素被删除 |
| 修改原集合 | 是 |
| 参数不可为空 | 如果参数集合为空会抛出 NullPointerException |
| 返回值 | 如果集合发生变化返回 true,否则返回 false |
| 常见用途 | 找交集、过滤集合中的元素 |
retainAll() 是操作集合的一个常用方法,能够帮助开发者快速进行集合间的交集操作。在使用时,需要注意原集合会被修改,因此在某些场景下可能需要备份原集合数据以避免数据丢失。
相关文章:
Java retainAll() 详解
在 Java 中,retainAll() 是 Collection 接口(List、Set 等集合类实现该接口)的一种方法,用于保留集合中与指定集合交集的元素,删除其他所有元素。 以下是对 retainAll() 方法的详细讲解。 1. 方法定义 方法签名 boo…...
Redis的基本数据类型
初识Redis缓存 Redis缓存: 实际开发中经常使用Redis作为缓存数据库,从而提高数据存取效率,减轻后端数据库的压力。 可以将经常被查询的数据缓存起来,比如热点数据,这样当用户来访问的时候,就不需要到MyS…...
通过vite+vue3+pinia从0到1搭建一个uniapp应用
最近项目上要做一个app,选择了用uniapp作为开发框架;我大概看了一下uniapp的文档,根据文档从0到1搭了一个uniapp应用供大家参考。 因为本人习惯使用了WebStorm编译器,但是uniapp官方推荐使用HBuilder搭建,如果和我一样…...
Linux的桌面
Linux的桌面是可以卸载的 的确,Linux并不像Windows,Linux本身是一个基于命令行的操作系统,在内核眼中,桌面只不过是个普通的应用程序,所以,在Linux的桌面中可以完成的事情,命令行中也基本可以完…...
Easyexcel(5-自定义列宽)
相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出)Easyexcel(4-模板文件)Easyexcel(5-自定义列宽) 注解 ColumnWidth Data…...
操作系统实验 C++实现死锁检测算法
实验目的 模拟实现死锁检测算法 实验内容 1、 输入: “资源分配表”文件,每一行包含资源编号、进程编号两项(均用整数表示,并用空格分隔开),记录资源分配给了哪个进程。 “进程等待表”文件&…...
小鹏汽车智慧材料数据库系统项目总成数据同步
1、定时任务处理 2、提供了接口 小鹏方面提供的推送的数据表结构: 这几个表总数为100多万,经过条件筛选过滤后大概2万多条数据 小鹏的人给的示例图: 界面: SQL: -- 查询车型 select bmm.md_material_id, bmm.material_num, bm…...
1、HCIP之RSTP协议与STP相关安全配置
目录 RSTP—快速生成树协议 STP STP的缺点: STP的选举(Listening状态中): RSTP P/A(提议/同意)机制 同步机制: 边缘端口的配置: RSTP的端口角色划分: ensp模拟…...
Linux云服务器docker使用教程
诸神缄默不语-个人CSDN博文目录 我用的是腾讯云服务器,操作系统是OpenCloudOS 9,基本上可以当特色版CentOS用。 docker安装跟各个系统关系太大了,我就不写了。OpenCloudOS 9安装docker见这篇博文:腾讯云服务器使用教程 文章目录 …...
如何从android的webview 取得页面上的数据
要从Android的WebView中获取页面上的数据,通常有几种常见的方法: JavaScript Interface:通过JavaScript和Android Interface进行通信。这种方法允许你在JavaScript中调用Android的方法,反之亦然。 Evaluate JavaScriptÿ…...
VTK知识学习(12)- 读取PNG图像
1、代码 private void ShowPngImage(){vtkPNGReader pngReader vtkPNGReader.New();pngReader.SetFileName("D:\\图像\\boxes\\cardboard_boxes_01.png");pngReader.Update();vtkImageActor imageActor vtkImageActor.New();imageActor.SetInputData(pngReader.Get…...
Springboot项目搭建(3)-更改用户信息与文件上传
1.概要 前一章节完成了用户信息的注册、登录、详细信息查询,以及线程池与拦截器技术。 这一章完善了用户信息更新/更改功能,包括昵称、邮箱、头像、密码等... 而后接触到了本地上传和云上传,其二者区别: 选择本地上传还是云上…...
Docker1:认识docker、在Linux中安装docker
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
python成绩分级 2024年6月python二级真题 青少年编程电子学会编程等级考试python二级真题解析
目录 python成绩分级 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python成绩分级 2024年6月 python编程等级考试二级编程题 一、题目要求 …...
android 如何获取当前 Activity 的类名和包名
其一:getClass().getSimpleName() public static String getTopActivity(Context context){ ActivityManager am (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); ComponentName cn am.getRunningTasks(1).get(0).topAct…...
Spring Boot 项目 myblog 整理
myblog 项目是一个典型的 Spring Boot 项目,主要包括用户注册、登录、文章管理(创建、查询、更新、删除)等功能。 1. 项目结构与依赖设置 项目初始化与依赖 使用 Spring Initializr 创建项目。引入必要的依赖包: Spring Boot W…...
uniapp 城市选择插件
uniapp城市选择插件 如上图 地址 完整demo <template><view><city-selectcityClick"cityClick":formatName"formatName":activeCity"activeCity":hotCity"hotCity":obtainCitys"obtainCitys":isSearch&quo…...
测试工程师如何在面试中脱颖而出
目录 1.平时工作中是怎么去测的? 2.B/S架构和C/S架构区别 3.B/S架构的系统从哪些点去测? 4.你为什么能够做测试这一行?(根据个人情况分析理解) 5.你认为测试的目的是什么? 6.软件测试的流程ÿ…...
Mesh路由组网
Mesh无线网格网络,多跳(multi-hop)网络,为解决全屋覆盖信号,一般用于家庭网络和小型企业 原理 网关路由器(主路由,连接光猫),Mesh路由器(子路由,…...
LeetCode131:分割回文串
题目链接:131. 分割回文串 - 力扣(LeetCode) 代码如下: class Solution { private:vector<vector<string>> result;vector<string> path; // 放已经回文的子串void backtracking (const string& s, int s…...
如何快速永久保存QQ空间历史说说?GetQzonehistory终极备份解决方案
如何快速永久保存QQ空间历史说说?GetQzonehistory终极备份解决方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心QQ空间里那些珍贵的青春记忆会随着时间流逝而消…...
STM32F103C8T6 GPIO驱动LED保姆级教程(附完整代码)
STM32F103C8T6 GPIO驱动LED实战指南:从寄存器操作到HAL库封装 开篇:为什么选择STM32作为嵌入式开发入门 在众多微控制器中,STM32系列因其完善的生态和丰富的资源成为工程师的首选。特别是STM32F103C8T6这款被爱好者称为"蓝色药丸"的…...
告别Fiddler和Charles,用Proxyman在Android 13上抓HTTPS包(附network_security_config.xml配置)
移动端开发者必备:Proxyman在Android 13上的HTTPS抓包实战指南 如果你是一名移动端开发者,一定遇到过这样的场景:应用在测试环境中表现良好,但上线后却出现各种网络请求异常。传统的Fiddler和Charles虽然功能强大,但在…...
像素语言·维度裂变器:5分钟上手,像玩游戏一样改写你的文字
像素语言维度裂变器:5分钟上手,像玩游戏一样改写你的文字 1. 认识你的文字冒险工坊 像素语言维度裂变器是一款将AI文本改写变成像素冒险游戏的创意工具。它基于MT5-Zero-Shot-Augment引擎,但完全颠覆了传统AI工具的刻板印象,把枯…...
UVM field automation机制详解:从宏定义到标志位设置的完整指南
UVM Field Automation机制深度解析:从宏定义到标志位实战指南 在芯片验证领域,UVM(Universal Verification Methodology)已经成为事实上的行业标准。而field automation机制作为UVM中最基础却又最容易被低估的功能之一,…...
gf调试器深度解析:从基础断点到高级性能分析的终极指南
gf调试器深度解析:从基础断点到高级性能分析的终极指南 【免费下载链接】gf A GDB frontend for Lnux. 项目地址: https://gitcode.com/gh_mirrors/gf3/gf 想要在Linux上获得更强大的调试体验吗?gf调试器作为GDB的前端界面,为开发者提…...
SEO_影响搜索引擎排名的关键SEO因素分析
SEO:影响搜索引擎排名的关键SEO因素分析 在当今信息爆炸的时代,网站的流量和曝光度直接决定了一个品牌的市场竞争力。搜索引擎优化(SEO)是提升网站在搜索结果中排名的重要手段。本文将从多个角度分析影响搜索引擎排名的关键SEO因…...
5个高效步骤打造Dell G15终极散热控制中心
5个高效步骤打造Dell G15终极散热控制中心 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 为什么专业游戏玩家和工程师都在抛弃官方散热软件?在高性…...
小白也能玩转Qwen3-TTS:一键部署多语言语音生成,实测效果惊艳
小白也能玩转Qwen3-TTS:一键部署多语言语音生成,实测效果惊艳 1. 为什么选择Qwen3-TTS 作为一个语音生成领域的从业者,我测试过市面上大多数TTS(文本转语音)模型,Qwen3-TTS-12Hz-1.7B-VoiceDesign给我留下…...
3个技巧让百度网盘下载提速10倍:突破限速的完整技术方案
3个技巧让百度网盘下载提速10倍:突破限速的完整技术方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘解析工具 baidu-wangpan-parse 是一款专为解决百度…...
