Java中判断集合是否相等的几种方法详解

 更新时间:2023年08月25日 10:32:20   作者:流苏打  
这篇文章主要介绍了Java中判断集合是否相等的几种方法详解,在平时的开发中,可能会遇到需要判断两个集合是否相等的需求,那么本文就来详细讲解一下几种实现方法,需要的朋友可以参考下

Java中判断集合是否相等

工作中经常会遇到这样一个需要:写一个定时任务每隔5s监听一个接口所发送的数据并存储转发。

只需要一个全局变量和一个局部变量即可实现,两者不相同则将数据赋值给全局变量,相同则不变。

因此在这里整理了几种判断集合是否相同的方法。

方法一:使用list中的containsAll方法

此方法是判断list2是否是list的子集,即list2包含于list

    //方法一:使用list中的containsAll方法,此方法是判断list2是否是list的子集,即list2包含于list
    public static void compareByContainsAll(List<String> list,List list2){
        boolean flag = false;
        if (list.size()==list2.size()){
                if (list.containsAll(list2)){
                    flag = true;
                }
        }
        System.out.println("方法一:"+flag);
    }

方法二:使用for循环遍历+contains方法

  //方法二:使用for循环遍历+contains方法
    public static void compareByFor(List<String> list,List list2){
        boolean flag = false;
        if (list.size()==list2.size()){
            for (String str :list){
                if (!list2.contains(str)){
                    System.out.println(flag);
                    return;
                }
            }
            flag = true;
        }
        System.out.println("方法二:"+flag);
    }

方法三:将list先排序再转为String进行比较

(此方法由于涉及同集合内的排序,因此需要该集合内数据类型一致)

    //方法三:将list先排序再转为String进行比较(此方法由于涉及同集合内的排序,因此需要该集合内数据类型一致)
    public static void compareByString(List<String> list,List list2){
        boolean flag = false;
        if (list.size()==list2.size()){
            //使用外部比较器Comparator进行排序,并利用Java8中新添加的特性方法引用来简化代码
            list.sort(Comparator.comparing(String::hashCode));
            //使用集合的sort方法对集合进行排序,本质是将集合转数组,再使用比较器进行排序
            Collections.sort(list2);
            if (list.toString().equals(list2.toString())){
                flag = true;
            }
        }
        System.out.println("方法三:"+flag);
    }

如果涉及到引用数据的排序比如里面的一个个对象数据,则需要实现Comparable接口,并重写CompareTo方法,在此方法中指定排序原则

package com.example.demo.utils;
import lombok.Data;
/**
 * @author zhangqianwei
 * @date 2021/9/7 17:25
 */
@Data
public class Student  implements Comparable<Student>{
    private int id;
    private String name;
    private int age;
    private String sex;
    public Student() {
    }
    public Student(int id, String name, int age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    @Override
    public int compareTo(Student o) {
        //按照年龄排序
        int result=this.getAge()-o.getAge();
        return result;
    }
}
    //如果涉及到引用数据的排序比如里面的一个个对象数据,则需要实现Comparable接口,并重写CompareTo方法,在此方法中指定排序原则
    public static void compareBySort(){
        ArrayList<Student> stus=new ArrayList<Student>();
        Student stu1=new Student(1,"张三",23,"男");
        Student stu2=new Student(2,"李四",21,"女");
        Student stu3=new Student(3,"王五",22,"女");
        Student stu4=new Student(4,"赵六",22,"女");
        stus.add(0,stu1);
        stus.add(1,stu2);
        stus.add(2,stu3);
        stus.add(3,stu4);
        System.out.println("原始顺序:"+stus);
        Collections.sort(stus);
        System.out.println("排序后:"+stus);
    }

方法四:使用list.retainAll()方法

如果集合list2中的元素都在集合list中则list2中的元素不做移除操作,反之如果只要有一个不在list中则会进行移除操作。

即:list进行移除操作返回值为:true反之返回值则为false。

    //方法四:使用list.retainAll()方法,此方法本质上是判断list是否有移除操作,如果list2是list的子集则不进行移除返回false,否则返回true
    //如果集合list2中的元素都在集合list中则list2中的元素不做移除操作,反之如果只要有一个不在list中则会进行移除操作。即:list进行移除操作返回值为:true反之返回值则为false。
    public static void compareByRetainAll(List<String> list,List list2){
        boolean flag = false;
        if (list.size()==list2.size()){
            if (!list.retainAll(list2)){
                flag = true;
            }
            System.out.println("方法四:"+flag);
        }
    }

方法五:使用MD5加密方式

使用MD5加密方式判断是否相同,这也算是list转String的一个变化,将元素根据加密规则转换为String加密字符串具有唯一性故可以进行判断;

根据唯一性可以想到map中的key也是具有唯一性的,将list中的元素逐个添加进map中作为key然后遍历比较list2中的元素是否都存在其中,不过这个要求list中的元素不重复

方法六:转换为Java8中的新特性steam流再进行排序来进行比较

public static void compareBySteam(List<String> list,List list2){
        boolean flag = false;
        if (list.size() == list2.size()){
            String steam = list.stream().sorted().collect(Collectors.joining());
            String steam2 = (String) list2.stream().sorted().collect(Collectors.joining());
            if (steam.equals(steam2)){
                flag = true;
            }
        }
        System.out.println("方法六:"+flag);
    }

工具类compareList完整代码:

package com.example.demo.utils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author zhangqianwei
 * @date 2021/10/8 11:46
 */
public class compareList {
    //比较两个集合是否相同
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("南京");
        list.add("苏州");
        list.add("常州");
        List list2 = new ArrayList<>();
        list2.add("常州");
        list2.add("苏州");
        list2.add("南京");
        compareByContainsAll(list,list2);
        compareByFor(list,list2);
        compareByString(list,list2);
        compareBySort();
        compareByRetainAll(list,list2);
        compareBySteam(list,list2);
    }
    //方法一:使用list中的containsAll方法,此方法是判断list2是否是list的子集,即list2包含于list
    public static void compareByContainsAll(List<String> list,List list2){
        boolean flag = false;
        if (list.size()==list2.size()){
                if (list.containsAll(list2)){
                    flag = true;
                }
        }
        System.out.println("方法一:"+flag);
    }
    //方法二:使用for循环遍历+contains方法
    public static void compareByFor(List<String> list,List list2){
        boolean flag = false;
        if (list.size()==list2.size()){
            for (String str :list){
                if (!list2.contains(str)){
                    System.out.println(flag);
                    return;
                }
            }
            flag = true;
        }
        System.out.println("方法二:"+flag);
    }
    //方法三:将list先排序再转为String进行比较(此方法由于涉及同集合内的排序,因此需要该集合内数据类型一致)
    public static void compareByString(List<String> list,List list2){
        boolean flag = false;
        if (list.size()==list2.size()){
            //使用外部比较器Comparator进行排序,并利用Java8中新添加的特性方法引用来简化代码
            list.sort(Comparator.comparing(String::hashCode));
            //使用集合的sort方法对集合进行排序,本质是将集合转数组,再使用比较器进行排序
            Collections.sort(list2);
            if (list.toString().equals(list2.toString())){
                flag = true;
            }
        }
        System.out.println("方法三:"+flag);
    }
    //如果涉及到引用数据的排序比如里面的一个个对象数据,则需要实现Comparable接口,并重写CompareTo方法,在此方法中指定排序原则
    public static void compareBySort(){
        ArrayList<Student> stus=new ArrayList<Student>();
        Student stu1=new Student(1,"张三",23,"男");
        Student stu2=new Student(2,"李四",21,"女");
        Student stu3=new Student(3,"王五",22,"女");
        Student stu4=new Student(4,"赵六",22,"女");
        stus.add(0,stu1);
        stus.add(1,stu2);
        stus.add(2,stu3);
        stus.add(3,stu4);
        System.out.println("原始顺序:"+stus);
        Collections.sort(stus);
        System.out.println("排序后:"+stus);
    }
    //方法四:使用list.retainAll()方法,此方法本质上是判断list是否有移除操作,如果list2是list的子集则不进行移除返回false,否则返回true
    //如果集合list2中的元素都在集合list中则list2中的元素不做移除操作,反之如果只要有一个不在list中则会进行移除操作。即:list进行移除操作返回值为:true反之返回值则为false。
    public static void compareByRetainAll(List<String> list,List list2){
        boolean flag = false;
        if (list.size()==list2.size()){
            if (!list.retainAll(list2)){
                flag = true;
            }
            System.out.println("方法四:"+flag);
        }
    }
    //方法五:使用MD5加密方式判断是否相同,这也算是list转String的一个变化,将元素根据加密规则转换为String加密字符串具有唯一性故可以进行判断
    //根据唯一性可以想到map中的key也是具有唯一性的,将list中的元素逐个添加进map中作为key然后遍历比较list2中的元素是否都存在其中,不过这个要求list中的元素不重复
    //方法六:转换为Java8中的新特性steam流再进行排序来进行比较
    public static void compareBySteam(List<String> list,List list2){
        boolean flag = false;
        if (list.size() == list2.size()){
            String steam = list.stream().sorted().collect(Collectors.joining());
            String steam2 = (String) list2.stream().sorted().collect(Collectors.joining());
            if (steam.equals(steam2)){
                flag = true;
            }
        }
        System.out.println("方法六:"+flag);
    }
}

到此这篇关于Java中判断集合是否相等的几种方法详解的文章就介绍到这了,更多相关Java中判断集合是否相等内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mapper接口注入两种方式详解

    mapper接口注入两种方式详解

    这篇文章主要介绍了mapper接口注入两种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • java中每月等额与先息后本计算

    java中每月等额与先息后本计算

    一般信用贷款会提供两种还款方式:每月等额或者先息后本。每月等额,就是每月归还等同的部分本金和利息,你手里在使用的本金其实是逐月减少的。先息后本就是先还利息,到期归还本金。本文将介绍他们的实现方法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • java门禁系统面向对象程序设计

    java门禁系统面向对象程序设计

    这篇文章主要为大家详细介绍了java门禁系统面向对象程序设计,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 一篇文章带你学会Spring MVC表单标签

    一篇文章带你学会Spring MVC表单标签

    Spring MVC表单标签是网页的可配置和可重复使用的构建块,下面这篇文章主要给大家介绍了如何通过一篇文章学会Spring MVC表单标签的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • Springmvc RequestMapping请求实现方法解析

    Springmvc RequestMapping请求实现方法解析

    这篇文章主要介绍了Springmvc RequestMapping请求实现方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 使用Prometheus+Grafana的方法监控Springboot应用教程详解

    使用Prometheus+Grafana的方法监控Springboot应用教程详解

    这篇文章主要介绍了用Prometheus+Grafana的方法监控Springboot应用,本文通过实例代码详解给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • springboot如何实现国际化配置

    springboot如何实现国际化配置

    这篇文章主要介绍了springboot如何实现国际化配置问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java Retrofit源码层深入分析

    Java Retrofit源码层深入分析

    这篇文章主要介绍了Java Retrofit源码层分析,Retrofit是一个RESTful的HTTP网络请求框架的封装,网络请求的工作本质上是OkHttp完成,而Retrofit仅负责网络请求接口的封装
    2023-01-01
  • 如何使用IDEA新建一个普通的Javaweb项目

    如何使用IDEA新建一个普通的Javaweb项目

    今天给大家普及如何使用IDEA新建一个普通的Javaweb项目及配置tomcat的方法,在文末给大家提到如果不想每次都重启tomcat,可以设置快捷方式,对idea新建Javaweb项目感兴趣的朋友一起看看吧
    2021-06-06
  • SpringCloud Eureka的使用教程

    SpringCloud Eureka的使用教程

    这篇文章主要给大家介绍了关于SpringCloud Eureka使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论