Java 中求两个 List集合的交集元素

java8利用Stream方法求两个List对象的交集、差集与并集(即:anyMatch和allMatch和noneMatch的区别详解) 这里anyMatch表示,判断的条件里,任意一个元素符合条件,就返回true值。在allMatch 接口定义中是接收 Predicate 类型参数,在Lamdba表达式中 Predicate 是接收一个T类型参数,然后经过逻辑验证返回布尔值结果。判断数据列表中全部元素都不符合设置的predicate条件,如果是就返回true,否则返回false,流为空时总是返回true。判断数据列表中全部元素都符合设置的predicate条件,如果是就返回true,否则返回false,流为空时总是返回true。 阅读详情
AI摘要

在Java中,求两个List集合交集元素有多种方式。可使用retainAll方法,它会修改原列表;也能利用Java 8的Stream API,灵活且不修改原集合;还能手动遍历。不同方法各有特点,需根据具体需求选择。

在 Java 中,求两个 List 的交集元素可以通过多种方式实现。常见的做法包括使用 retainAll 方法、Stream API 或手动遍历。以下是这些方法的原理和实现:

1. 使用 retainAll 方法

retainAll 是 Collection 接口中的一个方法,用于保留集合中与指定集合相同的元素,移除其他元素。

原理:
  • retainAll 方法会遍历当前集合,并检查每个元素是否存在于指定集合中。
  • 如果元素不存在于指定集合中,则从当前集合中移除该元素。
  • 最终,当前集合只保留与指定集合相同的元素。

retainAll 是 Java 中 List 接口提供的一个方法,用于保留列表中与指定集合中相同的元素,移除其他所有元素。换句话说,retainAll 方法会修改当前列表,使其仅包含与指定集合中相同的元素。


方法定义
boolean retainAll(Collection<?> c);
参数:
  • c:包含需要保留元素的集合。
返回值:
  • 如果列表因调用此方法而发生变化,则返回 true。
  • 如果列表未发生变化(即列表已经只包含指定集合中的元素),则返回 false。

方法行为
  1. 保留交集:retainAll 方法会保留当前列表与指定集合的交集。
  2. 移除其他元素:当前列表中不在指定集合中的元素会被移除。
  3. 修改原列表:retainAll 方法会直接修改当前列表,而不是返回一个新的列表。

示例代码

以下是一个简单的示例,展示 retainAll 方法的使用:

import java.util.ArrayList;
import java.util.List;

public class RetainAllExample {
    public static void main(String[] args) {
        // 创建两个列表
        List<String> list1 = new ArrayList<>();
        list1.add("Apple");
        list1.add("Banana");
        list1.add("Cherry");
        list1.add("Date");

        List<String> list2 = new ArrayList<>();
        list2.add("Banana");
        list2.add("Date");
        list2.add("Fig");

        // 调用 retainAll 方法
        boolean isChanged = list1.retainAll(list2);

        // 输出结果
        System.out.println("List1 是否发生变化: " + isChanged); // true
        System.out.println("List1 的内容: " + list1); // [Banana, Date]
        System.out.println("List2 的内容: " + list2); // [Banana, Date, Fig]
    }
}
输出:
List1 是否发生变化: true
List1 的内容: [Banana, Date]
List2 的内容: [Banana, Date, Fig]

关键点
  1. 修改原列表:

    • retainAll 方法会直接修改调用它的列表,而不是返回一个新的列表。
    • 如果需要保留原列表,可以在调用 retainAll 之前创建一个副本。
  2. 返回值:

    • 如果列表因调用 retainAll 而发生变化,则返回 true。
    • 如果列表未发生变化(即列表已经只包含指定集合中的元素),则返回 false。
  3. 集合比较:

    • retainAll 方法依赖于 equals 方法来比较元素是否相同。
    • 如果集合中包含自定义对象,请确保正确重写了 equals 和 hashCode 方法。
  4. 空集合:

    • 如果传入的集合为空(null 或空集合),retainAll 会抛出 NullPointerException 或清空当前列表。

注意事项

  1. 性能问题:

    • retainAll 方法的时间复杂度取决于列表的实现。对于 ArrayList,时间复杂度为 O(n*m),其中 n 是列表的大小,m 是集合的大小。
    • 如果列表和集合都很大,性能可能会受到影响。
  2. 集合类型:

    • retainAll 方法可以接受任何实现了 Collection 接口的对象作为参数,例如 List、Set 等。
  3. 元素重复:

    • 如果列表中有重复元素,而指定集合中没有重复元素,retainAll 会保留列表中的重复元素。
    • 例如:
      List<String> list1 = new ArrayList<>(List.of("A", "A", "B", "C"));
      List<String> list2 = new ArrayList<>(List.of("A", "B"));
      list1.retainAll(list2);
      System.out.println(list1); // 输出 [A, A, B]
      

注:
  • retainAll 方法用于保留列表中与指定集合中相同的元素,移除其他元素。
  • 它会直接修改原列表,并返回一个布尔值表示列表是否发生变化。
  • 使用时需要注意性能问题和集合类型的兼容性。
  • 如果需要保留原列表,可以在调用 retainAll 之前创建一个副本。

2. 使用 Stream API

Java 8 引入了 Stream API,可以方便地对集合进行操作。

原理:
  • 使用 stream() 方法将 List 转换为流。
  • 使用 filter 方法过滤出存在于另一个集合中的元素。
  • 使用 collect 方法将结果收集到一个新的 List 中。
示例代码:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);

        List<Integer> list2 = new ArrayList<>();
        list2.add(2);
        list2.add(3);
        list2.add(4);

        List<Integer> intersection = list1.stream()
                .filter(list2::contains)
                .collect(Collectors.toList());

        System.out.println(intersection); // 输出: [2, 3]
    }
}

3. 手动遍历

手动遍历两个 List,并找出共同的元素。

原理:
  • 遍历第一个 List 中的每个元素。
  • 检查该元素是否存在于第二个 List 中。
  • 如果存在,则将其添加到结果集合中。
示例代码:
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);

        List<Integer> list2 = new ArrayList<>();
        list2.add(2);
        list2.add(3);
        list2.add(4);

        List<Integer> intersection = new ArrayList<>();
        for (Integer item : list1) {
            if (list2.contains(item)) {
                intersection.add(item);
            }
        }

        System.out.println(intersection); // 输出: [2, 3]
    }
}

总结

  • retainAll 方法是最直接的方式,但会修改原始集合。
  • Stream API 提供了更灵活和函数式的编程方式,且不会修改原始集合。
  • 手动遍历适用于需要自定义逻辑的场景,但代码量较多。

根据具体需求选择合适的方法即可。

Java 求两个 List 集合的交集和差集 求两个 List 集合的交集和差集是 Java 开发中的常见需求。:代码简洁,适合现代项目。传统迭代方法:兼容性好,适合低版本 Java。:功能强大,适合需要更多集合操作的场景。希望本文的示例和讲解对您有所帮助,如果您在处理 List 集合交集和差集时有任何疑问,欢迎随时交流探讨! 阅读详情

相关推荐

Multisim 14.0元件库下载权威指南:官方与社区资源

详解Multisim元件库下载的官方途径与可靠社区资源,帮助用户快速获取Multisim 14.0所需元件模型,提升电路仿真效率。

weixin_32925455的博客 747

两个 list 求交集

两个 list 求交集, 一种方式是手动遍历, 然后判断是否 contains, 然后添加到结果 list 中 这里介绍另外一个方法 直接调用 list1.retainAll(list2), 调用完成后, list1 中不在 list2 的元素都会被剔除, 此时 list1 就是交集 /** * retain * 保留 */ @Test public void testRetain() { List<String> list1 =

艾斯比 2万+

Anaconda安装教程(超详细版)

目录 一、Anaconda简介 二、运行环境 三、安装Anaconda 四、手动配置环境变量(重点) 五、测试Anaconda环境是否配置成功 一、Anaconda简介 Anaconda,一个开源的Python发行版本,可用于管理Python及其相关包,包含了conda、Python等180多个科学包及其依赖项。 二、运行环境 Windows11 (Window10用户亦可参考,仅环境变量打开位置不同)。 三、安装Anaconda (1)百度“Anaconda”或者输入网址

m0_61607990的博客 22万+

java 获取两个List集合的交集

其中,retainAll方法会修改intersection集合,使其只包含两个集合的交集。在这个例子中,intersection集合最初是包含list1集合的元素的,然后通过retainAll方法过滤掉不属于list2集合的元素,最终得到两个集合的交集。

AstarCloud 1万+

FPGA可重构技术

介绍FPGA 可重构技术的实现方法,包括全局重构和部分重构

航天领域资深码农,型号经验丰富,一线干货分享 1989

【AI】使用Cursor和AI编程生成的VUE前端框架

本项目是一个基于VUE.js的前端框架,结合了登录、图形验证码、权限校验等常用功能模块。通过与Cursor AI交互生成的代码,展示了AI在编程中的潜力与效率。

清欢渡的博客 9860

Java List集合取交集的八种不同实现方式

在Java中,取两个List集合的交集可以通过多种方式实现,包括使用Java 8的Stream API、传统的for循环遍历、使用集合的retainAll方法,以及使用Apache Commons Collections库等。

码到三十五 1万+

鲸鱼优化算法(WOA)与门控循环单元(GRU)结合的预测模型(WOA-GRU)及其Python和MATLAB实现

Python和MATLAB的实现均突出模型结构和优化过程。2. **全局搜索与局部搜索结合**:WOA在寻优时,既有全局搜索的能力,又具备局部精准搜索的能力,能有效避免陷入局部最优解。2. **简化结构**:与长短期记忆(LSTM)相比,GRU的结构更为简化,避免了多层细胞结构,提高了计算效率。4. **使用WOA进行优化**:通过WOA迭代优化GRU模型中的参数,如学习率、批量大小和GRU单元的权重。3. **良好的表现**:GRU在多个时序数据序列的预测任务中表现优异,特别是在较短的数据序列中。

qq_45441438的博客 1323

java 求两个list 集合的交集,重复的元素

/** * 数值重复 */ @Test public void testList(){ List<Integer> accountIdListOne = new ArrayList<>(); accountIdListOne.add(1); accountIdListOne.add(2); accountIdListOne.add(3); List<Integ.

weixin_53709630的博客 2626

《C++等级认证CCF-GESP真题解析》专栏总目录

❤️ 专栏名称:《C++等级认证CCF-GESP真题解析》🌸 专栏介绍:中国计算机学会GESP《CCF编程能力等级认证》C++编程(1~8级)历届真题解析。🚀 订阅专栏:订阅后可阅读专栏内所有真题解析,真题持续更新中,欢迎订阅!

人生就是一个不断学习的过程 6287

华为od 面试手撕代码题【完成任务最少小时】

华为od 面试手撕代码题【完成任务最少小时】

MISAYAONE的博客 1579

java集合 arrayList源码分析删除元素求两个list之间的交集(下)

一、arrayList 如何删除元素 指定位置删除(批量) // 执行删除指定位置的元素的功能 public E remove(int index) { rangeCheck(index); // 检查index是否超出list大小范围,否则抛出异常 checkForComodification(); // 检验修改次数 E result = parent.remove(parentOffset + index);

小码农吗 712

基于YOLOv8的铁路轨道异物检测系统设计与实现

目标检测是计算机视觉领域的核心任务之一,旨在识别图像中特定目标的位置和类别。传统方法主要依赖手工特征(如HOG、SIFT等)和分类器(如SVM),而深度学习方法通过卷积神经网络自动学习特征表示,显著提升了检测性能。YOLO(You Only Look Once)系列算法作为单阶段目标检测的代表,以其高效的检测速度著称。YOLOv8是Ultralytics公司于2023年发布的最新版本,在精度和速度上都有进一步提升。

YOLO 574

Java 查找两个集合中的相同元素和不同元素

1简单元素的查找一、找到2个集合中相同和不同的元素本文分享的示例代码实现提取2个集合中相同和不同的元素此处需要使用Collection集合所提供的一个方法:removeAll(Cellection list),removeAll方法用于从列表中移除指定collection中包含的所有元素。语法 removeAll(Collection&lt;?&gt; c)c:包含从列表中移除元素的collect...

qq_28273051的博客 4万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java找出2个集合相同和不同的元素(以及去除List中的重复元素)

一、找到2个集合中相同和不同的元素 此处需要使用Collection集合所提供的一个方法:removeAll(Cellection list) 实现代码如下: import java.util.ArrayList; import java.util.Collection; import java.util.List; public class Test { public

逝者如风 4856

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

List与Map的常用操作

简述 在正常使用集合(list)的时候经常涉及到两个集合的交集,并集,补集的运算,这篇文章主要解决项目中常见的几种运算操作 1 求两个List的交集 List&lt;Long&gt; uidsArrayList = new ArrayList&lt;Long&gt;(); Map&lt;Long, Boolean&gt; existMap = new HashMap&lt;Long, Boolea...

HAN_789的博客 422

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

List中交集补集全集等集合的基本操作

----------------------------java 两个list 交集 并集 差集 去重复并集--------------------------- List list1 =new ArrayList(); list1.add(“A”); list1.add("B); List list2 =new ArrayList(); list2.add(“B”); list2.add(“C”...

qq_42292373的博客 559

消除 list重复值及交集,并集,差集

消除 list重复值 Java代码   public void removeDuplicate(List list) {      HashSet h = new HashSet(list);      list.clear();      list.addAll(h);    }   交集: Java代码         list.retai

418

集合List中消除重复值与取得两个List中的交、并、差集

消除 list重复值 Java代码 public void removeDuplicate(List list) { HashSet h = new HashSet(list); list.clear(); list.addAll(h); } public void removeDuplicate(List list) { ...

iteye_4141的博客 130

集合的交集,并集和虑重

前言 集合大家最熟悉不过了,今天就演示几种情况 交集(A与B去除交集后的A) 需求:仅保留在集合A 不在集合B的集合 public class Demo2 { public static void main(String[] args) { List<Integer> A = new ArrayList<>(); for (int i = 0; i <4 ; i++) { A.add(i); }

WindwirdBird的博客 380

stream流使用

两个list之间取取交集、并集、差集 两个List集合取交集、并集、差集 - 留一日白 - 博客园 (cnblogs.com)https://www.cnblogs.com/lyrb/p/12923615.html public static void main(String[] args) { List<String> list1 = new ArrayList<String>(); list1.add("1"); list1.add("2");

aqwyz的博客 93

两个List集合取交集

两个List集合取交集、并集、差集、去重并集的一个简单Demo,可供参考: import java.util.ArrayList; import java.util.List; import static java.util.stream.Collectors.toList; public class Test { public static void main(String[] args) { List<String> list1 = new ArrayLi

名字好难想 1万+

Java使用Stream求对象集合的交集、差集详解

Java 8使用Stream和Lambda表达式求对象集合的交集、差集

Knight of Zero 1万+

java获取两个List集合之间的交集、差集、并集

java获取两个List集合之间的交集、差集、并集

weixin_49114503的博客 1万+
上一篇: Spring 是如何解决循环依赖问题
下一篇: Object类中有哪些常用的方法
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值