最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中判斷集合是否相等的幾種方法詳解

 更新時(shí)間:2023年08月25日 10:32:20   作者:流蘇打  
這篇文章主要介紹了Java中判斷集合是否相等的幾種方法詳解,在平時(shí)的開發(fā)中,可能會遇到需要判斷兩個(gè)集合是否相等的需求,那么本文就來詳細(xì)講解一下幾種實(shí)現(xiàn)方法,需要的朋友可以參考下

Java中判斷集合是否相等

工作中經(jīng)常會遇到這樣一個(gè)需要:寫一個(gè)定時(shí)任務(wù)每隔5s監(jiān)聽一個(gè)接口所發(fā)送的數(shù)據(jù)并存儲轉(zhuǎn)發(fā)。

只需要一個(gè)全局變量和一個(gè)局部變量即可實(shí)現(xiàn),兩者不相同則將數(shù)據(jù)賦值給全局變量,相同則不變。

因此在這里整理了幾種判斷集合是否相同的方法。

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

此方法是判斷l(xiāng)ist2是否是list的子集,即list2包含于list

    //方法一:使用list中的containsAll方法,此方法是判斷l(xiāng)ist2是否是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循環(huán)遍歷+contains方法

  //方法二:使用for循環(huán)遍歷+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先排序再轉(zhuǎn)為String進(jìn)行比較

(此方法由于涉及同集合內(nèi)的排序,因此需要該集合內(nèi)數(shù)據(jù)類型一致)

    //方法三:將list先排序再轉(zhuǎn)為String進(jìn)行比較(此方法由于涉及同集合內(nèi)的排序,因此需要該集合內(nèi)數(shù)據(jù)類型一致)
    public static void compareByString(List<String> list,List list2){
        boolean flag = false;
        if (list.size()==list2.size()){
            //使用外部比較器Comparator進(jìn)行排序,并利用Java8中新添加的特性方法引用來簡化代碼
            list.sort(Comparator.comparing(String::hashCode));
            //使用集合的sort方法對集合進(jìn)行排序,本質(zhì)是將集合轉(zhuǎn)數(shù)組,再使用比較器進(jìn)行排序
            Collections.sort(list2);
            if (list.toString().equals(list2.toString())){
                flag = true;
            }
        }
        System.out.println("方法三:"+flag);
    }

如果涉及到引用數(shù)據(jù)的排序比如里面的一個(gè)個(gè)對象數(shù)據(jù),則需要實(shí)現(xiàn)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;
    }
}
    //如果涉及到引用數(shù)據(jù)的排序比如里面的一個(gè)個(gè)對象數(shù)據(jù),則需要實(shí)現(xiàn)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中的元素不做移除操作,反之如果只要有一個(gè)不在list中則會進(jìn)行移除操作。

即:list進(jìn)行移除操作返回值為:true反之返回值則為false。

    //方法四:使用list.retainAll()方法,此方法本質(zhì)上是判斷l(xiāng)ist是否有移除操作,如果list2是list的子集則不進(jìn)行移除返回false,否則返回true
    //如果集合list2中的元素都在集合list中則list2中的元素不做移除操作,反之如果只要有一個(gè)不在list中則會進(jìn)行移除操作。即:list進(jìn)行移除操作返回值為: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轉(zhuǎn)String的一個(gè)變化,將元素根據(jù)加密規(guī)則轉(zhuǎn)換為String加密字符串具有唯一性故可以進(jìn)行判斷;

根據(jù)唯一性可以想到map中的key也是具有唯一性的,將list中的元素逐個(gè)添加進(jìn)map中作為key然后遍歷比較list2中的元素是否都存在其中,不過這個(gè)要求list中的元素不重復(fù)

方法六:轉(zhuǎn)換為Java8中的新特性steam流再進(jìn)行排序來進(jìn)行比較

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 {
    //比較兩個(gè)集合是否相同
    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方法,此方法是判斷l(xiāng)ist2是否是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循環(huán)遍歷+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先排序再轉(zhuǎn)為String進(jìn)行比較(此方法由于涉及同集合內(nèi)的排序,因此需要該集合內(nèi)數(shù)據(jù)類型一致)
    public static void compareByString(List<String> list,List list2){
        boolean flag = false;
        if (list.size()==list2.size()){
            //使用外部比較器Comparator進(jìn)行排序,并利用Java8中新添加的特性方法引用來簡化代碼
            list.sort(Comparator.comparing(String::hashCode));
            //使用集合的sort方法對集合進(jìn)行排序,本質(zhì)是將集合轉(zhuǎn)數(shù)組,再使用比較器進(jìn)行排序
            Collections.sort(list2);
            if (list.toString().equals(list2.toString())){
                flag = true;
            }
        }
        System.out.println("方法三:"+flag);
    }
    //如果涉及到引用數(shù)據(jù)的排序比如里面的一個(gè)個(gè)對象數(shù)據(jù),則需要實(shí)現(xiàn)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()方法,此方法本質(zhì)上是判斷l(xiāng)ist是否有移除操作,如果list2是list的子集則不進(jìn)行移除返回false,否則返回true
    //如果集合list2中的元素都在集合list中則list2中的元素不做移除操作,反之如果只要有一個(gè)不在list中則會進(jìn)行移除操作。即:list進(jìn)行移除操作返回值為: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轉(zhuǎn)String的一個(gè)變化,將元素根據(jù)加密規(guī)則轉(zhuǎn)換為String加密字符串具有唯一性故可以進(jìn)行判斷
    //根據(jù)唯一性可以想到map中的key也是具有唯一性的,將list中的元素逐個(gè)添加進(jìn)map中作為key然后遍歷比較list2中的元素是否都存在其中,不過這個(gè)要求list中的元素不重復(fù)
    //方法六:轉(zhuǎn)換為Java8中的新特性steam流再進(jìn)行排序來進(jìn)行比較
    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);
    }
}

到此這篇關(guān)于Java中判斷集合是否相等的幾種方法詳解的文章就介紹到這了,更多相關(guān)Java中判斷集合是否相等內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mapper接口注入兩種方式詳解

    mapper接口注入兩種方式詳解

    這篇文章主要介紹了mapper接口注入兩種方式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • java中每月等額與先息后本計(jì)算

    java中每月等額與先息后本計(jì)算

    一般信用貸款會提供兩種還款方式:每月等額或者先息后本。每月等額,就是每月歸還等同的部分本金和利息,你手里在使用的本金其實(shí)是逐月減少的。先息后本就是先還利息,到期歸還本金。本文將介紹他們的實(shí)現(xiàn)方法。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-03-03
  • java門禁系統(tǒng)面向?qū)ο蟪绦蛟O(shè)計(jì)

    java門禁系統(tǒng)面向?qū)ο蟪绦蛟O(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了java門禁系統(tǒng)面向?qū)ο蟪绦蛟O(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 一篇文章帶你學(xué)會Spring?MVC表單標(biāo)簽

    一篇文章帶你學(xué)會Spring?MVC表單標(biāo)簽

    Spring MVC表單標(biāo)簽是網(wǎng)頁的可配置和可重復(fù)使用的構(gòu)建塊,下面這篇文章主要給大家介紹了如何通過一篇文章學(xué)會Spring?MVC表單標(biāo)簽的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • Springmvc RequestMapping請求實(shí)現(xiàn)方法解析

    Springmvc RequestMapping請求實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Springmvc RequestMapping請求實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 使用Prometheus+Grafana的方法監(jiān)控Springboot應(yīng)用教程詳解

    使用Prometheus+Grafana的方法監(jiān)控Springboot應(yīng)用教程詳解

    這篇文章主要介紹了用Prometheus+Grafana的方法監(jiān)控Springboot應(yīng)用,本文通過實(shí)例代碼詳解給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • springboot如何實(shí)現(xiàn)國際化配置

    springboot如何實(shí)現(xiàn)國際化配置

    這篇文章主要介紹了springboot如何實(shí)現(xiàn)國際化配置問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java Retrofit源碼層深入分析

    Java Retrofit源碼層深入分析

    這篇文章主要介紹了Java Retrofit源碼層分析,Retrofit是一個(gè)RESTful的HTTP網(wǎng)絡(luò)請求框架的封裝,網(wǎng)絡(luò)請求的工作本質(zhì)上是OkHttp完成,而Retrofit僅負(fù)責(zé)網(wǎng)絡(luò)請求接口的封裝
    2023-01-01
  • 如何使用IDEA新建一個(gè)普通的Javaweb項(xiàng)目

    如何使用IDEA新建一個(gè)普通的Javaweb項(xiàng)目

    今天給大家普及如何使用IDEA新建一個(gè)普通的Javaweb項(xiàng)目及配置tomcat的方法,在文末給大家提到如果不想每次都重啟tomcat,可以設(shè)置快捷方式,對idea新建Javaweb項(xiàng)目感興趣的朋友一起看看吧
    2021-06-06
  • SpringCloud Eureka的使用教程

    SpringCloud Eureka的使用教程

    這篇文章主要給大家介紹了關(guān)于SpringCloud Eureka使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評論

平阴县| 乐清市| 庆阳市| 昌江| 托里县| 新营市| 邻水| 赣榆县| 筠连县| 寻甸| 湖口县| 湛江市| 华阴市| 读书| 安徽省| 建湖县| 弋阳县| 奉化市| 达拉特旗| 三门峡市| 清丰县| 沭阳县| 新晃| 司法| 墨竹工卡县| 荥经县| 横峰县| 介休市| 车致| 中江县| 云霄县| 夏河县| 乐都县| 新安县| 固阳县| 驻马店市| 玉田县| 融水| 宾阳县| 千阳县| 大田县|