我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java 集合操作之交集、并集和差集

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java 集合操作之交集、并集和差集

在 Java 编程中,经常需要对集合进行一些操作,比如取两个集合的交集、并集和差集。本文将介绍如何使用 Java 集合框架中的方法来实现这些集合操作,并通过源码解析来深入了解其实现原理。

先上代码

import lombok.extern.slf4j.Slf4j;import java.util.*;@Slf4jpublic class Test{    public static void main(String[] args) {        System.out.println("===============Set=================");        Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3, 4));        Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5, 6));        // 交集        Set<Integer> intersectionSet = new HashSet<>(set1);        intersectionSet.retainAll(set2);        System.out.println("交集:" + intersectionSet);        // 并集        Set<Integer> unionSet = new HashSet<>(set1);        unionSet.addAll(set2);        System.out.println("并集:" + unionSet);        // 差集        Set<Integer> differenceSet = new HashSet<>(set1);        differenceSet.removeAll(set2);        System.out.println("差集:" + differenceSet);        System.out.println("===============List=================");        List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4));        List<Integer> list2= new ArrayList<>(Arrays.asList(3, 4, 5, 6));        // 交集        List<Integer> intersectionList = new ArrayList<>(list1);        intersectionList.retainAll(list2);        System.out.println("交集:" + intersectionSet);        // 并集        List<Integer> unionList = new ArrayList<>(list1);        unionList.addAll(list2);        System.out.println("并集:" + unionList);        // 差集        List<Integer> differenceList = new ArrayList<>(list1);        differenceList.removeAll(list2);        System.out.println("差集:" + differenceList);    }}

执行结果

===============Set=================交集:[3, 4]并集:[1, 2, 3, 4, 5, 6]差集:[1, 2]===============List=================交集:[3, 4]并集:[1, 2, 3, 4, 3, 4, 5, 6]差集:[1, 2]

此处各操作会改动原始集合,所以此处的操作都是创建了一个新的集合来执行操作

  1. 交集(Intersection):

交集是指两个集合中共有的元素集合。在 Java 中,可以使用 retainAll 方法来实现两个集合的交集操作。retainAll 方法会修改调用该方法的集合,使其只包含与指定集合共有的元素

源码解析:

  • Set

在AbstractCollection的 retainAll 方法的内部实现中,通常会遍历调用该方法的集合,并逐个判断元素是否存在于指定集合中。如果元素不存在于指定集合,则通过迭代器的 remove 方法将其从集合中删除。这样就实现了只保留共有元素的操作。

    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
    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 work                for (int i = w; i < size; i++)                    elementData[i] = null;                modCount += size - w;                size = w;                modified = true;            }        }        return modified;    }
  1. 并集(Union):
    并集是指将两个集合中的所有元素合并到一个新的集合中。在 Java 中,可以使用 addAll 方法来实现两个集合的并集操作。addAll 方法会将指定集合中的所有元素添加到调用该方法的集合中。
  • Set

addAll 方法的内部实现会遍历指定集合,并逐个将元素添加到调用该方法的集合中。如果被添加的元素已经存在于集合中,则不会重复添加。

    public boolean addAll(Collection<? extends E> c) {        boolean modified = false;        for (E e : c)            if (add(e))                modified = true;        return modified;    }
  • ArrayList
    public boolean addAll(Collection<? extends E> c) {        Object[] a = c.toArray();        int numNew = a.length;        ensureCapacityInternal(size + numNew);  // Increments modCount        System.arraycopy(a, 0, elementData, size, numNew);        size += numNew;        return numNew != 0;    }
  1. 差集(Difference):
    差集是指从一个集合中移除另一个集合中相同的元素后的剩余元素集合。在 Java 中,可以使用 removeAll 方法来实现两个集合的差集操作。removeAll 方法会修改调用该方法的集合,移除与指定集合相同的元素。
  • Set
    在 removeAll 方法的内部实现中,通常会遍历指定集合,并逐个判断元素是否存在于调用该方法的集合中。如果元素存在于调用的集合中,则通过迭代器的 remove 方法将其从集合中移除。这样就实现了移除与指定集合相同元素的操作。
    public boolean removeAll(Collection<?> c) {        Objects.requireNonNull(c);        boolean modified = false;        Iterator<?> it = iterator();        while (it.hasNext()) {            if (c.contains(it.next())) {                it.remove();                modified = true;            }        }        return modified;    }
  • ArrayList
    public boolean removeAll(Collection<?> c) {        Objects.requireNonNull(c);        return batchRemove(c, false);    }        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 work                for (int i = w; i < size; i++)                    elementData[i] = null;                modCount += size - w;                size = w;                modified = true;            }        }        return modified;    }

本文介绍了在 Java 中实现集合的交集、并集和差集操作的方法,并通过源码解析来深入了解其实现原理。这些集合操作在实际开发中经常使用,可以帮助我们处理集合数据,快速进行元素筛选和计算。掌握这些操作可以提高代码的效率和可读性。

来源地址:https://blog.csdn.net/weixin_44002151/article/details/131546005

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java 集合操作之交集、并集和差集

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【Java】求两集合的交集、并集、差集

一、内置函数实现 1、removeAll方法:从list中删除指定集合中包含的所有元素。 2、retainAll方法:从list中删除指定集合中不包含的所有元素。 3、addAll方法:用来向Set集合添加另一个集合对象所包含的所有内容。
2023-08-18

Java之Set 交集,差集,并集的用法

这篇文章主要介绍了Java之Set 交集,差集,并集的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-18

java8集合求差集、并集、交集的示例分析

这篇文章将为大家详细讲解有关java8集合求差集、并集、交集的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言java8里最大亮点是lambda,让我们用习惯C# linq的语法,也能眼前一亮。
2023-05-30

Java计算交集,差集,并集的方法示例

本文实例讲述了Java计算交集,差集,并集的方法。分享给大家供大家参考,具体如下:package math;import java.util.HashSet;import java.util.Set;public class Test {
2023-05-30

MySQL 查询 并集、交集、差集方式

这篇文章主要介绍了MySQL 查询 并集、交集、差集方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-07

MySQL 查询 并集、交集、差集方式

目录mysql查询交集、并集、差集背景和使用的数据样本基本语法注意事项总结MySQL查询交集、并集、差集背景和使用的数据样本该章节学些主要涉及到Datawhale SQL 组队学习任务;本次使用的数据,由Datawhale 开源提供,
2023-02-07

MySQL查询 并集、交集、差集方式

MySQL查询并集、交集、差集可以通过使用UNION、INTERSECT和EXCEPT(或MINUS)操作符来实现。1. 并集(UNION):将两个查询的结果集合并为一个结果集,不包括重复的行。```sqlSELECT column1, c
2023-08-09

java中计算集合的交差并集示例代码

前言本文主要给大家简单介绍下,如何使用apache commons以及guava的类库来计算集合的交差并集。分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。maven com
2023-05-31

SQL UNION(并集)、INTERSECT(交集)、EXCEPT(差集)

目录一、什么是集合运算二、表的加法——UNION三、集合运算的注意事项四、包含重复行的集合运算——ALL 选项五、选取表中公共部分——INTERSECT六、记录的减法——EXCEPT请参阅学习重点集合运算就是对满足同一规则的记录进行的加减等四则运算。使用 UN
SQL UNION(并集)、INTERSECT(交集)、EXCEPT(差集)
2017-10-25

如何在redis中使用交集、并集和差集

这期内容当中小编将会给大家带来有关如何在redis中使用交集、并集和差集,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、sinter 、sunion 、sdiffredis 支持 Set集合的数据存储,
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录