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);
    }

}

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值