Java比較集合是否相等的技巧分享
一、集合相等的定義
說兩個(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)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-10-10
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ù),需要的朋友可以參考下2020-02-02
實(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
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多態(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
使用feign調(diào)用接口時(shí)調(diào)不到get方法的問題及解決
這篇文章主要介紹了使用feign調(diào)用接口時(shí)調(diào)不到get方法的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

