多个 List 如何取交集、并集、去重并集、差集?

news/2024/7/7 19:33:14

因为如果 List 里面装的是对象,一定要重写 equals 和 hashcode 方法(都是 Object 类下面的方法); 不然比较的是堆内存地址,那么本文也就毫无意义了。

/**
     * 对象类型的处理
     */
    public static void test1() {
        List<Student> list1 = new ArrayList<>();
        list1.add(new Student("思乡渔夫","F0002"));
        list1.add(new Student("阿胖山","F0001"));
        list1.add(new Student("牛叔","N1003"));

        List<Student> list2 = new ArrayList<>();
        list2.add(new Student("牛叔","N1003"));
        list2.add(new Student("玉田","N1004"));
        // 交集
        List<Student> intersection = list1.stream().filter(list2::contains).collect(Collectors.toList());
        System.out.println("---交集---"+intersection);

        // 差集 (list1 - list2)
        List<Student> reduce1 = list1.stream().filter(item -> !list2.contains(item)).collect(Collectors.toList());
        System.out.println("---差集 (list1 - list2)---"+reduce1);

        // 差集 (list2 - list1)
        List<Student> reduce2 = list2.stream().filter(item -> !list1.contains(item)).collect(Collectors.toList());
        System.out.println("---差集 (list2 - list1)---"+reduce2);

        // 并集
        CollectionUtils.addAll(list1,list2);
        System.out.println("---并集 list---"+list1);

        // 去重并集,方法有很多这里只列举一种
        HashSet<Student> hashSet = new HashSet<>(list1);
        System.out.println("---去重并集 list---"+hashSet);
  }

重写hashcode 与 equals方法

1.equals方法
主要用来判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同,且区分大小写。

而自定义的对象,需要重写equals()方法,来判断两个对象是否在属性和内容上“相等”。

2.hashCode方法
hashCode()方法将对象在内存中的地址作为哈希码返回,可以保证不同对象的返回值不同。

与equals()方法类似,hashCode()方法可以被重写。

3.重写 equals与hashcode方法

   @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id == user.id &&
                age == user.age &&
                Objects.equals(name, user.name) &&
                Objects.equals(gender, user.gender) &&
                Objects.equals(birthday, user.birthday);
    }
    public int hashCode() {
        return Objects.hash(id, name, gender, age, birthday);
    }

同时重写的原因:
在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同,即这个应用程序这次执行返回的整数与下一次执行返回的整数可以不一致。
如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。
如果两个对象根据equals(Object)方法是不相等的,那么调用这两个对象中任一个对象的hashCode方法,不要求必须产生不同的整数结果。然而,程序员应该意识到这样的事实,对于不相等的对象产生截然不同的整数结果,有可能提高散列表(hash table)的性能。
 


http://lihuaxi.xjx100.cn/news/797742.html

相关文章

C/C++ 内存泄漏检测

C/C 内存泄漏检测内存泄漏的两个问题使用宏定义覆盖 malloc 和 free 函数使用 hook 钩子最近学习了 C/C 内存泄漏检测的相关知识&#xff0c;写博客记录一下。 内存泄漏的两个问题 是否有内存泄漏&#xff1f;内存泄漏是在代码的哪一行&#xff1f; 检测内存泄漏主要从上面两…

软件测试项目实战,我们拿到项目第一步应该怎么做【附过程文档】

对于从事软件研发的组织来说&#xff0c;工作类型至少包括项目管理、产品设计、编码、测试、质量保证和软件配置管理&#xff0c;以及其它人员&#xff0c;如文档编制人员和美工人员/系统硬件管理人员等。根据职能需要&#xff0c;可以以半独立方式进行部门和项目的矩阵管理&am…

关于fuse的常用启动参数

1、启动fuse用户态守护进程 参数比较多&#xff0c;一般正常使用需要的命令类似下面即可 /myfuseexe 源挂载路径 目的挂载路径 -o allow_other -o auto_unmount 例如&#xff1a; /myfuseexe /src /data/src -o allow_other -o auto_unmount 把/src目录挂载到/dat…

电脑重装系统装不了如何解决

重装系统装不了如何解决&#xff1f;当电脑出现故障时&#xff0c;大部分人都会选择重装系统来解决这个问题&#xff0c;但是有人出现系统重装不了&#xff0c;下面小编就来为大家解决系统重装不了的问题。 工具/原料&#xff1a; 系统版本&#xff1a;win7 品牌型号&#xff…

QT-线性拟合(自动找直线区域)

最近有个需求&#xff0c;需要对一个S曲线的散点图做线性拟合&#xff0c;百度上线性拟合和曲线拟合公式很多&#xff0c;没什么问题&#xff0c;但需求里面有一个预期就是自动找出直线部分&#xff0c;前面因为其它事情耽搁&#xff0c;一直没有实现&#xff0c;心里多少有点梗…

JSON格式店铺商品列表api

对于做竟店分析来说&#xff0c;首先要知道店铺有哪些商品&#xff0c;店铺宝贝列表则提供了这样的入口&#xff0c;可以查看该店铺的所有宝贝&#xff0c;也可以通过关键词全局搜索来获取店铺宝贝&#xff0c;但搜索会夹带这很多推荐的结果在里面&#xff0c;会比较混乱。 淘宝…

E5061B矢量网络分析仪VNA概念

矢量网络分析仪VNA是一种测试仪器&#xff0c;它可以将网络的响应测量成矢量:实参数和虚参数&#xff0c;从而表征其性能。矢量网络分析仪VNA是射频设计实验室和许多制造和服务领域的重要测试仪器。虽然矢量网络分析仪主要侧重于研究和开发&#xff0c;但它也可以为所有类型的R…

自注意力和位置编码(比较卷积神经网络、循环神经网络和自注意力)

在自注意力中&#xff0c;查询、键和值都来自同一组输入。 卷积神经网络和自注意力都拥有并行计算的优势&#xff0c;而且自注意力的最大路径长度最短。但是因为其计算复杂度是关于序列长度的二次方&#xff0c;所以在很长的序列中计算会非常慢。 为了使用序列的顺序信息&…