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

Java比較集合是否相等的技巧分享

 更新時(shí)間:2025年06月25日 09:36:32   作者:竹子愛揍功夫熊貓  
集合使我們開發(fā)過程中非常用到的,要說最常用的,非List莫屬,那么當(dāng)我們想要比較兩個(gè)List是否相等的時(shí)候,應(yīng)該怎么處理呢?本文將介紹幾個(gè)小技巧來(lái)處理,需要的朋友可以參考下

一、集合相等的定義

說兩個(gè)東西是否相等,首先要弄清楚這里相等是什么意思,值相等,內(nèi)存地址相等還是別的什么相等。

1.1 集合相等的基本概念

  • 集合大小相同
  • 集合中的元素相同
  • 元素的順序(對(duì)于有序集合)和重復(fù)性(對(duì)于允許重復(fù)的集合)是否一致

1.2 不同集合類型的相等性特點(diǎn)

  • List:有序,允許重復(fù)
  • Set:無(wú)序,不允許重復(fù)
  • Map:鍵值對(duì)存儲(chǔ),鍵唯一

二、Java中比較集合相等的快速方法

Java本身是提供了相等比較的方法的,這里來(lái)看看都有哪些。

2.1 使用equals()方法

equals()方法在集合類中的實(shí)現(xiàn)原理是都有自己的特點(diǎn)的,我們下面綜合實(shí)際案例一起看看:

  • 對(duì)于List,比較元素順序和內(nèi)容
import java.util.ArrayList;
import java.util.List;

public class ArrayListComparison {

    public static void main(String[] args) {
        // 創(chuàng)建第一個(gè)ArrayList
        List<String> list1 = new ArrayList<>();
        list1.add("Apple");
        list1.add("Banana");
        list1.add("Cherry");

        // 創(chuàng)建第二個(gè)ArrayList
        List<String> list2 = new ArrayList<>();
        list2.add("Apple");
        list2.add("Banana");
        list2.add("Cherry");

        // 創(chuàng)建第三個(gè)ArrayList(用于測(cè)試不相等的情況)
        List<String> list3 = new ArrayList<>();
        list3.add("Apple");
        list3.add("Cherry");
        list3.add("Banana");

        // 比較list1和list2是否相等
        boolean isEqual1 = list1.equals(list2);
        System.out.println("list1和list2是否相等: " + isEqual1);

        // 比較list1和list3是否相等
        boolean isEqual2 = list1.equals(list3);
        System.out.println("list1和list3是否相等: " + isEqual2);
    }
    
}

在這里插入圖片描述

上面的執(zhí)行結(jié)果可以很明顯的看出,即使元素內(nèi)容一樣,順序不一樣,他們的結(jié)果也是不同的。

  • 對(duì)于Set,比較元素內(nèi)容,忽略順序
import java.util.HashSet;
import java.util.Set;

public class HashSetComparison {
    public static void main(String[] args) {
        // 創(chuàng)建兩個(gè)HashSet對(duì)象
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> set2 = new HashSet<>();
        Set<Integer> set3 = new HashSet<>();

        // 添加元素到set1
        set1.add(1);
        set1.add(2);
        set1.add(3);

        // 添加元素到set2,順序不同
        set2.add(3);
        set2.add(1);
        set2.add(2);

        // 添加元素到set3,順序不同
        set3.add(3);
        set3.add(1);
        set3.add(2);
        set3.add(4);

        // 輸出結(jié)果
        System.out.println("set1和set2是否相等: " + set1.equals(set2));
        System.out.println("set2和set3是否相等: " + set2.equals(set3));
    }

}

在這里插入圖片描述

上面執(zhí)行的結(jié)果不難看出,set集合,只在乎元素是否相同,不在乎里面的順序。

  • 對(duì)于Map,比較鍵值對(duì)
import java.util.HashMap;
import java.util.Map;

public class HashMapComparison {
    public static void main(String[] args) {
        // 創(chuàng)建兩個(gè)HashMap對(duì)象
        Map<String, Integer> map1 = new HashMap<>();
        Map<String, Integer> map2 = new HashMap<>();
        Map<String, Integer> map3 = new HashMap<>();

        // 添加鍵值對(duì)到map1
        map1.put("apple", 1);
        map1.put("banana", 2);
        map1.put("cherry", 3);

        // 添加鍵值對(duì)到map2,順序不同
        map2.put("apple", 1);
        map2.put("cherry", 3);
        map2.put("banana", 2);

        // 添加鍵值對(duì)到map3,值不同
        map3.put("banana", 3);
        map3.put("apple", 3);
        map3.put("cherry", 3);

        // 輸出結(jié)果
        System.out.println("map1和map2是否相等: " + map1.equals(map2));
        System.out.println("map2和map3是否相等: " + map3.equals(map2));
    }

}

在這里插入圖片描述

從上面的執(zhí)行結(jié)果可以看出,Map比較的是鍵值對(duì)是否一致,也是和順序無(wú)關(guān)的。

值得注意的是,Map本身建議使用entrySet()方法再進(jìn)行equals方法。

在這里插入圖片描述

三、值得推薦的寫法和三方庫(kù)

實(shí)際有很多第三方庫(kù)都實(shí)現(xiàn)了集合的比較,例如Apache Commons Collections(這個(gè)有的版本List比較是不區(qū)分順序的,實(shí)際操作要注意)、Google Guava、和Hutool

使用這些三方庫(kù)可以有效的提高代碼的可讀性,并且使用起來(lái)都比較簡(jiǎn)潔,傳說有的三方庫(kù)還有一些性能提升(這個(gè)我沒驗(yàn)證過)。

3.1 推薦使用庫(kù) Hutool

Hutool是一個(gè)國(guó)產(chǎn)的Java工具包,提供了豐富的集合操作功能,同時(shí)還包含文件操作、加密解密、日志等其他實(shí)用工具。它簡(jiǎn)化了集合的比較和操作,例如合并、交集、差集等。

  • 依賴引入
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.11</version>
</dependency>
  • 示例代碼
import cn.hutool.core.collection.CollUtil;

import java.util.ArrayList;
import java.util.List;

public class HutoolExample {

    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("Apple");
        list1.add("Banana");
        list1.add("Cherry");

        List<String> list2 = new ArrayList<>();
        list2.add("Apple");
        list2.add("Banana");
        list2.add("Cherry");

        // 比較兩個(gè)集合是否相等
        boolean isEqual = CollUtil.equals(list1, list2);
        System.out.println("list1和list2是否相等: " + isEqual); // 輸出 true
    }
    
}

3.2 不用三方庫(kù)的推薦寫法 Objects.equals

java.util.Objects.equals 是 Java 標(biāo)準(zhǔn)庫(kù)中的一個(gè)實(shí)用工具方法,用于比較兩個(gè)對(duì)象是否相等。它在 Java 7 中引入,旨在簡(jiǎn)化對(duì)象比較的代碼,同時(shí)避免空指針異常(NullPointerException)。這個(gè)方法非常實(shí)用,尤其是在處理可能為 null 的對(duì)象時(shí)。

  • 使用案例:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Objects;

public class ObjectsComparison {

    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
        ArrayList<String> list2 = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
        ArrayList<String> list3 = new ArrayList<>(Arrays.asList("Apple", "Cherry", "Banana"));

        boolean isEqual1 = Objects.equals(list1, list2);
        boolean isEqual2 = Objects.equals(list1, list3);

        System.out.println("list1和list2是否相等: " + isEqual1); // true
        System.out.println("list1和list3是否相等: " + isEqual2); // false
    }

}
  • 執(zhí)行結(jié)果:

在這里插入圖片描述

3.2.1 實(shí)現(xiàn)原理

Objects.equals 的實(shí)現(xiàn)邏輯非常簡(jiǎn)單,以下是它的源碼:

在這里插入圖片描述

  • 如果兩個(gè)對(duì)象引用相同(a == b),直接返回 true。
  • 如果第一個(gè)對(duì)象不為 null,調(diào)用 a.equals(b) 方法進(jìn)行比較。
  • 如果兩個(gè)對(duì)象都為 null,返回 true

四、總結(jié)

不管是什么職級(jí)的開發(fā)工程師,在Java開發(fā)中,你都會(huì)使用到集合,集合比較是否相等是一個(gè)比較常見的方法,要弄清楚這個(gè)集合比較的基本規(guī)則,你才能更好的去實(shí)現(xiàn)需求。

以上就是Java比較集合是否相等的技巧分享的詳細(xì)內(nèi)容,更多關(guān)于Java比較集合相等的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 格式化輸出JSON字符串的2種實(shí)現(xiàn)操作

    Java 格式化輸出JSON字符串的2種實(shí)現(xiàn)操作

    這篇文章主要介紹了Java 格式化輸出JSON字符串的2種實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-10-10
  • spring無(wú)法引入注解及import org.springframework.web.bind.annotation.*報(bào)錯(cuò)的解決

    spring無(wú)法引入注解及import org.springframework.web.bind.annota

    本文主要介紹了spring無(wú)法引入注解及import org.springframework.web.bind.annotation.*報(bào)錯(cuò)的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • java數(shù)據(jù)庫(kù)開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫(kù)

    java數(shù)據(jù)庫(kù)開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫(kù)

    這篇文章主要介紹了java數(shù)據(jù)庫(kù)開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫(kù),需要的朋友可以參考下
    2020-02-02
  • 實(shí)現(xiàn)Java刪除一個(gè)集合的多個(gè)元素

    實(shí)現(xiàn)Java刪除一個(gè)集合的多個(gè)元素

    Java中的For each實(shí)際上使用的是iterator進(jìn)行處理的。而iterator是不允許集合在iterator使用期間刪除的。而我在for each時(shí),從集合中刪除了一個(gè)元素,這導(dǎo)致了iterator拋出了ConcurrentModificationException,下面來(lái)看看到底怎么回事。
    2016-08-08
  • SimpleDateFormat在多線程下的安全問題及解決

    SimpleDateFormat在多線程下的安全問題及解決

    SimpleDateFormat類在Java中用于日期時(shí)間的格式化和解析,但在高并發(fā)環(huán)境下存在線程不安全的問題,原因是它共享了一個(gè)Calendar對(duì)象,導(dǎo)致多個(gè)線程操作時(shí)出現(xiàn)沖突,為了解決這個(gè)問題,可以使用局部變量、加鎖或使用線程安全的DateTimeFormatter類
    2026-03-03
  • Java多線程Thread基礎(chǔ)學(xué)習(xí)

    Java多線程Thread基礎(chǔ)學(xué)習(xí)

    每一個(gè)正在執(zhí)行的程序都是一個(gè)進(jìn)程,資源只有一塊,所以在同一時(shí)間段會(huì)有多個(gè)程序同時(shí)執(zhí)行,但是在一個(gè)時(shí)間點(diǎn)上,只能由一個(gè)程序執(zhí)行,多線程是在一個(gè)進(jìn)程的基礎(chǔ)之上的進(jìn)一步劃分,需要的朋友可以參考下
    2023-04-04
  • Java的覆寫操作實(shí)例分析

    Java的覆寫操作實(shí)例分析

    這篇文章主要介紹了Java的覆寫操作,結(jié)合實(shí)例形式分析了java屬性覆寫及super調(diào)用父類方法覆寫相關(guān)操作技巧,需要的朋友可以參考下
    2019-10-10
  • 詳解Java多態(tài)對(duì)象的類型轉(zhuǎn)換與動(dòng)態(tài)綁定

    詳解Java多態(tài)對(duì)象的類型轉(zhuǎn)換與動(dòng)態(tài)綁定

    這篇文章主要介紹了詳解Java多態(tài)對(duì)象的類型轉(zhuǎn)換與動(dòng)態(tài)綁定,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • jvm運(yùn)行原理以及類加載器實(shí)例詳解

    jvm運(yùn)行原理以及類加載器實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于jvm運(yùn)行原理以及類加載器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 使用feign調(diào)用接口時(shí)調(diào)不到get方法的問題及解決

    使用feign調(diào)用接口時(shí)調(diào)不到get方法的問題及解決

    這篇文章主要介紹了使用feign調(diào)用接口時(shí)調(diào)不到get方法的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論

墨脱县| 自贡市| 屯昌县| 来宾市| 蒙山县| 莱西市| 马公市| 荣成市| 微博| 桐乡市| 荣昌县| 宜都市| 福建省| 普格县| 贵定县| 乐至县| 宁城县| 鄂州市| 册亨县| 清徐县| 宝兴县| 延安市| 中卫市| 高州市| 仙居县| 健康| 元朗区| 留坝县| 乌兰县| 都江堰市| 龙陵县| 鄂托克旗| 五寨县| 清涧县| 淄博市| 清苑县| 山西省| 开江县| 金山区| 隆子县| 炎陵县|