java 判斷兩個(gè)List是否包含 判斷兩個(gè)list相等
https://blog.51cto.com/u_12855/7333853
1、直接使用equals()比較
眾所周知,兩個(gè)列表具有完全相同的元素并且具有完全相同的順序時(shí),它們是相等的。因此, 如果我們業(yè)務(wù)要求兩個(gè)list順序一致,可以使用equals()方法進(jìn)行相等性檢查:
@Test
public void equalityCheckOfTwoLists() {
??
? ? List<Integer> list1 = Arrays.asList(1, 2, 3);
? ? List<Integer> list2 = Arrays.asList(1, 2, 3);
? ? List<Integer> list3 = Arrays.asList(2, 1, 3);
??
? ? assertTrue(list1.equals(list2));
? ? assertFalse(list1.equals(list3));
??
}
即使list1的和項(xiàng)目list3包含相同的元素{1,2,3},但是元素順序不一樣,所以list1和list3還是不相等的。
注意:
有的業(yè)務(wù)要求元素順序不必要求一致 我們要做的就是檢查兩個(gè)列表是否包含相同的元素,而不管它們?cè)诹斜碇械捻樞?,那如何去?shí)現(xiàn)呢?
2、將list排序之后再比較
處理邏輯主要有:
(1) 如果兩個(gè)list都為null,則返回true
(2)如果一個(gè)list不為空 ,另外一個(gè)指向空值返回false
(3)兩個(gè)list的size()不同 ,返回false。
public <T extends Comparable<T>> boolean isEquals(List<T> list1, List<T> list2){ ? ??
? ? if (list1 == null && list2 == null) {
? ? ? ? return true;
? ? }
? ? //Only one of them is null
? ? else if(list1 == null || list2 == null) {
? ? ? ? return false;
? ? }
? ? else if(list1.size() != list2.size()) {
? ? ? ? return false;?
? ? }
? ? ?
? ? //copying to avoid rearranging original lists
? ? list1 = new ArrayList<T>(list1);?
? ? list2 = new ArrayList<T>(list2); ??
??
? ? Collections.sort(list1);
? ? Collections.sort(list2); ? ? ?
? ? ?
? ? return list1.equals(list2);
}
請(qǐng)注意:
我們這里創(chuàng)建了兩個(gè)列表的副本來(lái)保證原始列表中的元素保持不變。
3、使用Sets / contains()比較list
如果列表沒(méi)有重復(fù)元素 ,我們可以使用list中創(chuàng)建TreeSet,然后使用equals()比較它們:
public <T extends Comparable<T>> boolean isEquals(List<T> list1, List<T> list2){ ? ??
? ? if (list1 == null && list2 == null) {
? ? ? ? return true;
? ? }
? ? //Only one of them is null
? ? else if(list1 == null || list2 == null) {
? ? ? ? return false;
? ? }
? ? else if(list1.size() != list2.size()) {
? ? ? ? return false;?
? ? }
??
? ? Set<T> set1 = new TreeSet<>(list1);
? ? Set<T> set2 = new TreeSet<>(list2);
? ? ?
? ? return set1.equals(set2);
}
我們可以更加簡(jiǎn)單使用contains()比較,不用創(chuàng)建 Sets:
return list1.containsAll(list2) && list2.containsAll(list1);
new HashSet<>(list1).containsAll(list2.get()) &&
new HashSet<>(list2.get()).containsAll(list1))?
new HashSet<>(list1.get()).containsAll(list2.get()) &&
new HashSet<>(list2.get()).containsAll(list1.get()))?? ??
? ? ? ? ? ? ?
但是這里要注意 如果我們list元素存在重復(fù),使用contains()或者 Sets比較就會(huì)有問(wèn)題??聪旅孢@個(gè)案例你就知道怎么回事了。
List<Integer> list1 = Arrays.asList(1, 2, 3, 3);
List<Integer> list2 = Arrays.asList(3, 1, 2, 2);
??
// will return true, but actual value should be false
System.out.println(list1.isEquals(list2));
在上面的示例中,list1包含一個(gè)2和兩個(gè)3,而list2包含兩個(gè)2和一個(gè)3,我們可以看到兩個(gè)list其實(shí)是不相等的,但是程序會(huì)錯(cuò)誤地返回true。所以使用這個(gè)方法時(shí)要確保list元素沒(méi)有重復(fù)的。
4、使用Apache Commons工具類
CollectionUtils提供了集合相等的判斷工具方法isEqualCollection,只要我們確保兩個(gè)集合非空可以直接使用該方法來(lái)判斷集合相等。
List<Integer> list1 = Arrays.asList(1, 2, 3, 3);
List<Integer> list2 = Arrays.asList(3, 1, 3, 2);
??
System.out.println(CollectionUtils.isEqualCollection(list1, list2)); //true
5、結(jié)論
今天我們學(xué)習(xí)了檢查Java中兩個(gè)列表是否相等4種方法,一般默認(rèn)情況下,當(dāng)兩個(gè)列表具有相同順序的相同元素時(shí),我們就知道它們是相等的。如果我們對(duì)元素的順序不太關(guān)心的話,可以采用其它幾種方法進(jìn)行列表相等性比較。
java list containsAll效率
https://blog.51cto.com/u_16175440/6861303
在Java中,List是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)一組有序的元素。List提供了containsAll()方法用于判斷一個(gè)List是否包含另一個(gè)List中的所有元素。然而,在某些情況下,containsAll()方法的效率可能會(huì)變得很低,本文將對(duì)其效率進(jìn)行分析,并提供一些優(yōu)化的方法。
containsAll()方法的使用
在使用containsAll()方法之前,讓我們先了解一下它的用法。containsAll()方法接受一個(gè)Collection類型的參數(shù),用于判斷當(dāng)前List是否包含該Collection中的所有元素。它返回一個(gè)布爾值,表示是否包含所有元素。
以下是一個(gè)示例代碼:
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
list1.add(3);
List<Integer> list2 = new ArrayList<>();
list2.add(2);
list2.add(3);
boolean containsAll = list1.containsAll(list2);
System.out.println("List1 contains all elements of List2: " + containsAll); // 輸出:true
在上述示例中,我們定義了兩個(gè)List:list1和list2。list1包含了元素1、2和3,而list2只包含了元素2和3。通過(guò)調(diào)用list1.containsAll(list2)方法,我們可以判斷l(xiāng)ist1是否包含list2中的所有元素。在本例中,list1確實(shí)包含list2中的所有元素,因此containsAll的返回值為true。
containsAll()方法的效率問(wèn)題
盡管containsAll()方法非常方便,但它的效率并不總是很高。特別是當(dāng)List中的元素?cái)?shù)量較大時(shí),containsAll()方法可能會(huì)引起性能問(wèn)題。這是因?yàn)閏ontainsAll()方法的實(shí)現(xiàn)需要遍歷兩個(gè)List,并逐個(gè)比較元素是否相等。對(duì)于包含n個(gè)元素的List,這將導(dǎo)致O(n^2)的時(shí)間復(fù)雜度。
以下是一個(gè)包含大量元素的示例代碼:
List<Integer> longList = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
? ? longList.add(i);
}
List<Integer> subList = new ArrayList<>();
for (int i = 9990; i < 10000; i++) {
? ? subList.add(i);
}
boolean containsAll = longList.containsAll(subList);
System.out.println("Long list contains all elements of sub list: " + containsAll);
在上述示例中,我們創(chuàng)建了一個(gè)包含10000個(gè)元素的longList,并從中截取了最后10個(gè)元素構(gòu)成subList。然后,我們使用containsAll()方法判斷l(xiāng)ongList是否包含subList中的所有元素。由于longList的長(zhǎng)度較大,containsAll()方法的執(zhí)行時(shí)間可能會(huì)很長(zhǎng)。
containsAll()方法的優(yōu)化
為了提高containsAll()方法的效率,我們可以采取一些優(yōu)化措施。以下是幾種常見(jiàn)的優(yōu)化方法:
使用Set代替List
由于List是有序的,containsAll()方法需要逐個(gè)比較元素的順序和值。而Set是無(wú)序的,containsAll()方法可以通過(guò)哈希表等數(shù)據(jù)結(jié)構(gòu)來(lái)快速判斷是否包含所有元素。因此,如果不需要保持元素的順序,可以考慮使用Set代替List來(lái)實(shí)現(xiàn)containsAll()方法。
Set<Integer> set1 = new HashSet<>(list1);
Set<Integer> set2 = new HashSet<>(list2);
boolean containsAll = set1.containsAll(set2);
System.out.println("Set1 contains all elements of Set2: " + containsAll);
通過(guò)將List轉(zhuǎn)換為Set,我們可以利用Set的高效查找特性,從而提高containsAll()方法的效率。
優(yōu)化equals()方法的復(fù)雜度
containsAll()方法的效率還受到元素的equals()方法實(shí)現(xiàn)復(fù)雜度的影響。如果元素的equals()方法的實(shí)現(xiàn)比較耗時(shí),那么containsAll()方法的效率也會(huì)下降。因此,我們可以優(yōu)化元素的equals()方法,以提高containsAll()方法的效率。
假設(shè)我們有一個(gè)自定義的元素類,其中equals()方法的實(shí)現(xiàn)如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-767219.html
登錄后復(fù)制?
public class MyElement {
? ? private int value;
? ??
? ? // 構(gòu)造函數(shù)、getter和
-----------------------------------文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-767219.html
到了這里,關(guān)于java 判斷兩個(gè)List是否包含 判斷兩個(gè)list相等的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!