Java中取多个集合的交集——retainAll()

article/2025/10/8 20:00:55

Java中取多个集合的交集

集合 Collection 接口中定义了 retainAll()方法

retainAll()

Retains only the elements in this set that are contained in the specified collection (optional operation). In other words, removes from this set all of its elements that are not contained in the specified collection. If the specified collection is also a set, this operation effectively modifies this set so that its value is the intersection of the two sets.

简单来说,该方法目的是取当前集合参数指定集合的一个交集,并修改当前集合,仅保留交集元素。

下图是集合类框架的一个架构图:
在这里插入图片描述

通过这个架构图,可以在大脑中对集合这块的类有个清晰的定位。

抽象类 AbstractCollection 中对 retainAll() 方法进行了实现。
使用Set集合的 retainAll() 方法,其实就是调用了AbstractCollection中的 retainAll()方法。

其底层其实使用的 contains() 方法进行判断元素是否存在集合中。对于当前集合中的元素进行遍历,判断每个元素是否存在于参数集合中,若不存在则从当前集合中移除该元素,最终保留的就是两个集合共有的元素。

public boolean retainAll(Collection<?> c) {Objects.requireNonNull(c);boolean modified = false;Iterator<E> it = iterator();while (it.hasNext()) {if (!c.contains(it.next())) {it.remove();modified = true;}}return modified;}

对于 ArrayList 类,对 retainAll() 方法进行了重写。其中的核心思路是一样的。

public boolean retainAll(Collection<?> c) {Objects.requireNonNull(c);return batchRemove(c, true);}private boolean batchRemove(Collection<?> c, boolean complement) {final Object[] elementData = this.elementData;int r = 0, w = 0;boolean modified = false;try {for (; r < size; r++)if (c.contains(elementData[r]) == complement)elementData[w++] = elementData[r];} finally {// Preserve behavioral compatibility with AbstractCollection,// even if c.contains() throws.if (r != size) {System.arraycopy(elementData, r,elementData, w,size - r);w += size - r;}if (w != size) {// clear to let GC do its workfor (int i = w; i < size; i++)elementData[i] = null;modCount += size - w;size = w;modified = true;}}return modified;}

对于多个集合取交集(不确定集合的个数)

思路:
创建一个新的 List 集合,将目标集合都放入新创建的 List 集合中,若有条件过滤,可使用stream流进行条件筛选(比如去掉空集合),最终得到结果 List 集合。
然后遍历该集合,使用集合中的第一个集合依次和后续的每个集合取交集,即可得到所有集合的交集。

Set set1 = new HashSet();
Set set2 = new HashSet();
Set set3 = new HashSet();set1.add("1");
set2.add("1");
set2.add("2");
set3.add("1");List<Set> setList = new ArrayList<>();
setList.add(set1);
setList.add(set2);
setList.add(set3);//List<Set> resultSetList = setList.stream().filter(Objects::nonNull).collect(Collectors.toList());Set resultSet = setList.get(0);
resultSetList.forEach(item -> {resultSet.retainAll(item);
});//resultSet 结果仅包含 1

再复杂的东西都是由简单的东西组成的,只因量变达到质变。


http://chatgpt.dhexx.cn/article/KTMP1x0N.shtml

相关文章

测试工程师面试题答案分类详解

数据库最基本的增&#xff0c;删&#xff0c;改&#xff0c;查&#xff0c; 假设表结构为&#xff1a; create table student( sid number, sname varchar2(50) ) 1.增加&#xff1a;insert into student values(1,张三) 2.删除&#xff1a;delete from student 3.…

软件测试工程师面试题及答案

软件测试工程师试题 一、填空 1、软件测试阶段的基本任务应当是根据软件开发各阶段的 和程序的 &#xff0c;精心设计一批“高产”的测试用例&#xff0c;利用这些测试用例 &#xff0c;找出软件中潜藏的各种错误和缺陷。 2、测试用例不仅要选用合理的测试输入数据&…

测试笔试题

做了几套题&#xff0c;个别题竟然错了。汗颜。摘录下&#xff1a; 1.有关字节换算的 字节 byte&#xff1a;8个二进制位为一个字节(B)&#xff0c;最常用的单位&#xff0c;字节也就是B。 1KB (Kilobyte 千字节)1024B 1MB (Megabyte 兆字节 简称“兆”)1024KBA 1GB (Giga…

测试工程师面试题

选择题 进行兼容性测试的目的在于&#xff08;&#xff09; A、测试程序在不同的平台上可以正常运行B、测试程序与平台上的其他程序可以同时正常运行C、测试数据格式在不同应用程序之间可以通用D、以上选项都正确 某个 Android 应用耗电问题严重&#xff0c;以下那个是可能的…

软件测试工程师面试题汇总

小编热衷于收集整理资源&#xff0c;记录踩坑到爬坑的过程。希望能把自己所学&#xff0c;实际工作中使用的技术、学习方法、心得及踩过的一些坑&#xff0c;记录下来。也希望想做软件测试的你一样&#xff0c;通过我的分享可以少走一些弯路&#xff0c;可以形成一套自己的方法…

100道经典软件测试笔试题(附答案)一次性查缺补漏个够

千呼万唤始出来&#xff0c;很多群友说我看了这么多面试题&#xff0c;但是公司要笔试怎么办&#xff1f;有没有能够笔试给我们练练手&#xff0c;这边我也是特意帮大家整理了这么100道软件测试的笔试题&#xff0c;答案在最后&#xff0c;试试自己能答对多少吧&#xff01;需要…

软件测试工程师笔试题(附带答案)

软件测试题目 一、 判断题 (每题2分&#xff0c;20) 1、软件测试就是为了验证软件功能实现的是否正确&#xff0c;是否完成既定目标的活动&#xff0c;所以软件测试在软件工程的后期才开始具体的工作。 &#xff08;初级&#xff09; &#xff08; &#xff09; 2、发现错误多…

初级测试工程师面试笔试题(附带答案)

1.编写测试用例有哪几种方法&#xff1f; 答&#xff1a;大刚法、等价类、边界值、因果图、场景法、正交法、错误推断法、正则表达式 2.测试的六条基本法则是什么&#xff1f; 答&#xff1a;功能、可靠性、易用性、效率、可维护性、可移植性 3.软件测试分类有哪些&#xff1f;…

2022年最新软件测试工程师笔试真题及答案(搜狐、华为、蓝港在线)

搜狐软件测试工程师笔试真题及答案 试题1&#xff0e;下列哪个覆盖的范围最广&#xff1f;条件、条件组合、语句、判定条件。 答案&#xff1a;条件组合。 试题2&#xff0e;Java Web应用的3层结构是什么&#xff1f; 答案&#xff1a;浏览器/中间层&#xff08;Java ASP等…

hadoop安装前的网络环境配置

1.1 网络配置 对安装好的 VMware 进行网络配置&#xff0c;方便虚拟机连接网络&#xff0c;本次设置建议选择 NAT 模 式&#xff0c;需要宿主机的 Windows 和虚拟机的 Linux 能够进行网络连接&#xff0c;同时虚拟机的 Linux 可 以通过宿主机的 Windows 进入互联网。 1.1.1 编…

Windows下Hadoop的环境变量的配置以及Hadoop的配置文件修改

Hadoop的环境变量的配置 1.进入系统变量&#xff0c;右键单击我的电脑 –>属性 –>高级环境变量配置 –>高级选项卡 –>环境变量 –> 单击新建HADOOP_HOME 2.在系统变量path 里面 添加 %HADOOP_HOME%\bin; 3.测试&#xff1a;打开命令行cmd ,在任意路径下输入h…

Hadoop应用配置

文章目录 hadoop目录配置hadoop角色hadoop运行和使用hadoop 观察FsImage和EditLog分发配置 hadoop目录 bin &#xff1a;功能模块sbin&#xff1a;shell脚本etc&#xff1a;配置lib&#xff1a;使用库 bin和sbin目录都要加入到环境变量中。 vi /etc/profile增加&#xff1a; …

配置Hadoop_1

配置Hadoop_1 1. 配置jdk2. 配置Hadoop3.完全分布式运行环境&#xff08;配置集群&#xff09;3.1 编写集群分发脚本xsync3.2 rsync远程同步工具3.3 xsync集群分发脚本3.4 SSH无密登录配置3.5集群配置3.6 配置历史服务器3.7 配置日志的聚集 3.8 两个常用脚本asd 1. 配置jdk 上…

hadoop集群配置(保姆级教学)

目录 1 .集群配置 &#xff08;1&#xff09;集群部署规划 (2&#xff09;配置文件说明 (3&#xff09;配置集群 &#xff08;1&#xff09;核心配置文件 &#xff08;2&#xff09;HDFS配置文件 &#xff08;3&#xff09;YARN配置文件 &#xff08;4&#xff09;MapRedu…

Hadoop集群配置

一&#xff1a;集群部署规划 注意&#xff1a; ➢ NameNode和SecondaryNameNode不要安装在同一台服务器 ➢ ResourceManager也很消耗内存&#xff0c;不要和NameNode、SecondaryNameNode配置在同一台机器上。 二&#xff1a;配置文件说明 Hadoop配置文件分两类&#xff1a…

Hadoop配置环境变量(详解版)

1.运行hadoop的程序报错java.io.IOException: Could not locate executable nullinwinutils.exe in the Hadoop binaries. **这是因为windows环境变量不兼容的原因解决办法&#xff1a; 首先需要下载 hadoop的tar.gz包&#xff0c;前提是JDK必须配置成功&#xff0c;存放路径不…

hadoop配置文件

安装前的工作&#xff1a; jdk集群中节计算机互联互通关闭防火墙节点间的计算机免密码登录&#xff08;authorized_keys认证文件root用户存放在/root/.ssh/&#xff09; (User用户 /home/user/.ssh/) A计算机免密码登录B计算机&#xff0c;将A计算机的公钥存放在B计算机的认证…

4.Hadoop环境配置

4. 集群配置 4.1 集群部署规划 安装前先做好节点规划&#xff0c;完全分布式目前规划1个主节点&#xff08;Master&#xff09;和2个从节点&#xff08;Slave&#xff09;一共三个节点。 部署规划要求&#xff1a; NameNode和SecondaryNameNode不要安装在同一台服务器。Reso…

hadoop环境配置

hadoop环境配置 一、VmWare与linux版本VmWare版本&#xff1a;linux版本 二、使用VmWare来安装linux软件三、三台linux服务器环境准备1、三台机器IP设置2、三台机器关闭防火墙3、三台机器关闭selinux4、三台机器更改主机名5、三台机器更改主机名与IP地址映射6、三台机器同步时间…

hadoop详细安装及配置

一、下载 http://hadoop.apache.org/ hadoop官网 二、解压 注&#xff1a;使用管理员权限解压 三、配置环境变量 添加HADOOP_HOME配置&#xff1a;自己安装hadoop路径&#xff0c;我的是D:\hadoop-3.0.3 在Path中添加如下&#xff1a;自己安装hadoop路径/bin&#xff0c;…