Java比較集合是否相等的技巧分享
一、集合相等的定義
說(shuō)兩個(gè)東西是否相等,首先要弄清楚這里相等是什么意思,值相等,內(nèi)存地址相等還是別的什么相等。
1.1 集合相等的基本概念
- 集合大小相同
- 集合中的元素相同
- 元素的順序(對(duì)于有序集合)和重復(fù)性(對(duì)于允許重復(fù)的集合)是否一致
1.2 不同集合類(lèi)型的相等性特點(diǎn)
- List:有序,允許重復(fù)
- Set:無(wú)序,不允許重復(fù)
- Map:鍵值對(duì)存儲(chǔ),鍵唯一
二、Java中比較集合相等的快速方法
Java本身是提供了相等比較的方法的,這里來(lái)看看都有哪些。
2.1 使用equals()方法
equals()方法在集合類(lèi)中的實(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方法。

三、值得推薦的寫(xiě)法和三方庫(kù)
實(shí)際有很多第三方庫(kù)都實(shí)現(xiàn)了集合的比較,例如Apache Commons Collections(這個(gè)有的版本List比較是不區(qū)分順序的,實(shí)際操作要注意)、Google Guava、和Hutool。
使用這些三方庫(kù)可以有效的提高代碼的可讀性,并且使用起來(lái)都比較簡(jiǎn)潔,傳說(shuō)有的三方庫(kù)還有一些性能提升(這個(gè)我沒(méi)驗(yàn)證過(guò))。
3.1 推薦使用庫(kù) Hutool
Hutool是一個(gè)國(guó)產(chǎn)的Java工具包,提供了豐富的集合操作功能,同時(shí)還包含文件操作、加密解密、日志等其他實(shí)用工具。它簡(jiǎn)化了集合的比較和操作,例如合并、交集、差集等。
- 依賴(lài)引入:
<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ù)的推薦寫(xiě)法 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í)的開(kāi)發(fā)工程師,在Java開(kāi)發(fā)中,你都會(huì)使用到集合,集合比較是否相等是一個(gè)比較常見(jiàn)的方法,要弄清楚這個(gè)集合比較的基本規(guī)則,你才能更好的去實(shí)現(xiàn)需求。
以上就是Java比較集合是否相等的技巧分享的詳細(xì)內(nèi)容,更多關(guān)于Java比較集合相等的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Hibernate框架數(shù)據(jù)分頁(yè)技術(shù)實(shí)例分析
這篇文章主要介紹了Hibernate框架數(shù)據(jù)分頁(yè)技術(shù),結(jié)合實(shí)例形式分析了Hibernate框架實(shí)現(xiàn)數(shù)據(jù)分頁(yè)的原理,步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-03-03
JAVA使用DBUtils操作數(shù)據(jù)庫(kù)
這篇文章主要介紹了JAVA使用DBUtils操作數(shù)據(jù)庫(kù)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家學(xué)習(xí)JAVA,感興趣的朋友可以了解下2020-07-07
Java+Spring+MySql環(huán)境中安裝和配置MyBatis的教程
這篇文章主要介紹了Java+Spring+MySql環(huán)境中安裝和配置MyBatis的教程,MyBatis一般被用來(lái)增強(qiáng)數(shù)據(jù)庫(kù)操作,文中對(duì)MyBatis的主配置文件有較為詳細(xì)的講解,需要的朋友可以參考下2016-04-04
IDEA編譯報(bào)錯(cuò):Error:java:無(wú)效的源發(fā)行版:17的解決辦法
IDEA里面裝了幾個(gè)版本的JDK,導(dǎo)入工程后時(shí)不時(shí)提示一下錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于IDEA編譯報(bào)錯(cuò):Error:java:無(wú)效的源發(fā)行版:17的解決辦法,需要的朋友可以參考下2023-01-01
SpringMVC HttpMessageConverter消息轉(zhuǎn)換器
??HttpMessageConverter???,報(bào)文信息轉(zhuǎn)換器,將請(qǐng)求報(bào)文轉(zhuǎn)換為Java對(duì)象,或?qū)ava對(duì)象轉(zhuǎn)換為響應(yīng)報(bào)文。???HttpMessageConverter???提供了兩個(gè)注解和兩個(gè)類(lèi)型:??@RequestBody,@ResponseBody???,??RequestEntity,ResponseEntity??2023-04-04
解決SpringMVC Controller 接收頁(yè)面?zhèn)鬟f的中文參數(shù)出現(xiàn)亂碼的問(wèn)題
下面小編就為大家分享一篇解決SpringMVC Controller 接收頁(yè)面?zhèn)鬟f的中文參數(shù)出現(xiàn)亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
Java之不通過(guò)構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象問(wèn)題
這篇文章主要介紹了Java之不通過(guò)構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03

