Java比較集合是否相等的技巧分享
一、集合相等的定義
說兩個東西是否相等,首先要弄清楚這里相等是什么意思,值相等,內(nèi)存地址相等還是別的什么相等。
1.1 集合相等的基本概念
- 集合大小相同
- 集合中的元素相同
- 元素的順序(對于有序集合)和重復(fù)性(對于允許重復(fù)的集合)是否一致
1.2 不同集合類型的相等性特點
- List:有序,允許重復(fù)
- Set:無序,不允許重復(fù)
- Map:鍵值對存儲,鍵唯一
二、Java中比較集合相等的快速方法
Java本身是提供了相等比較的方法的,這里來看看都有哪些。
2.1 使用equals()方法
equals()方法在集合類中的實現(xiàn)原理是都有自己的特點的,我們下面綜合實際案例一起看看:
- 對于
List,比較元素順序和內(nèi)容
import java.util.ArrayList;
import java.util.List;
public class ArrayListComparison {
public static void main(String[] args) {
// 創(chuàng)建第一個ArrayList
List<String> list1 = new ArrayList<>();
list1.add("Apple");
list1.add("Banana");
list1.add("Cherry");
// 創(chuàng)建第二個ArrayList
List<String> list2 = new ArrayList<>();
list2.add("Apple");
list2.add("Banana");
list2.add("Cherry");
// 創(chuàng)建第三個ArrayList(用于測試不相等的情況)
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é)果也是不同的。
- 對于
Set,比較元素內(nèi)容,忽略順序
import java.util.HashSet;
import java.util.Set;
public class HashSetComparison {
public static void main(String[] args) {
// 創(chuàng)建兩個HashSet對象
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集合,只在乎元素是否相同,不在乎里面的順序。
- 對于
Map,比較鍵值對
import java.util.HashMap;
import java.util.Map;
public class HashMapComparison {
public static void main(String[] args) {
// 創(chuàng)建兩個HashMap對象
Map<String, Integer> map1 = new HashMap<>();
Map<String, Integer> map2 = new HashMap<>();
Map<String, Integer> map3 = new HashMap<>();
// 添加鍵值對到map1
map1.put("apple", 1);
map1.put("banana", 2);
map1.put("cherry", 3);
// 添加鍵值對到map2,順序不同
map2.put("apple", 1);
map2.put("cherry", 3);
map2.put("banana", 2);
// 添加鍵值對到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比較的是鍵值對是否一致,也是和順序無關(guān)的。
值得注意的是,Map本身建議使用entrySet()方法再進行equals方法。

三、值得推薦的寫法和三方庫
實際有很多第三方庫都實現(xiàn)了集合的比較,例如Apache Commons Collections(這個有的版本List比較是不區(qū)分順序的,實際操作要注意)、Google Guava、和Hutool。
使用這些三方庫可以有效的提高代碼的可讀性,并且使用起來都比較簡潔,傳說有的三方庫還有一些性能提升(這個我沒驗證過)。
3.1 推薦使用庫 Hutool
Hutool是一個國產(chǎn)的Java工具包,提供了豐富的集合操作功能,同時還包含文件操作、加密解密、日志等其他實用工具。它簡化了集合的比較和操作,例如合并、交集、差集等。
- 依賴引入:
<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");
// 比較兩個集合是否相等
boolean isEqual = CollUtil.equals(list1, list2);
System.out.println("list1和list2是否相等: " + isEqual); // 輸出 true
}
}
3.2 不用三方庫的推薦寫法 Objects.equals
java.util.Objects.equals 是 Java 標(biāo)準(zhǔn)庫中的一個實用工具方法,用于比較兩個對象是否相等。它在 Java 7 中引入,旨在簡化對象比較的代碼,同時避免空指針異常(NullPointerException)。這個方法非常實用,尤其是在處理可能為 null 的對象時。
- 使用案例:
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 實現(xiàn)原理
Objects.equals 的實現(xiàn)邏輯非常簡單,以下是它的源碼:

- 如果兩個對象引用相同(
a == b),直接返回true。 - 如果第一個對象不為
null,調(diào)用a.equals(b)方法進行比較。 - 如果兩個對象都為
null,返回true。
四、總結(jié)
不管是什么職級的開發(fā)工程師,在Java開發(fā)中,你都會使用到集合,集合比較是否相等是一個比較常見的方法,要弄清楚這個集合比較的基本規(guī)則,你才能更好的去實現(xiàn)需求。
以上就是Java比較集合是否相等的技巧分享的詳細(xì)內(nèi)容,更多關(guān)于Java比較集合相等的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java 格式化輸出JSON字符串的2種實現(xiàn)操作
這篇文章主要介紹了Java 格式化輸出JSON字符串的2種實現(xiàn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
spring無法引入注解及import org.springframework.web.bind.annota
本文主要介紹了spring無法引入注解及import org.springframework.web.bind.annotation.*報錯的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫
這篇文章主要介紹了java數(shù)據(jù)庫開發(fā)之JDBC的完整封裝兼容多種數(shù)據(jù)庫,需要的朋友可以參考下2020-02-02
Java多線程Thread基礎(chǔ)學(xué)習(xí)
每一個正在執(zhí)行的程序都是一個進程,資源只有一塊,所以在同一時間段會有多個程序同時執(zhí)行,但是在一個時間點上,只能由一個程序執(zhí)行,多線程是在一個進程的基礎(chǔ)之上的進一步劃分,需要的朋友可以參考下2023-04-04
詳解Java多態(tài)對象的類型轉(zhuǎn)換與動態(tài)綁定
這篇文章主要介紹了詳解Java多態(tài)對象的類型轉(zhuǎn)換與動態(tài)綁定,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
使用feign調(diào)用接口時調(diào)不到get方法的問題及解決
這篇文章主要介紹了使用feign調(diào)用接口時調(diào)不到get方法的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03

