一、背景介紹
當我們需要比較兩個Java集合時,常常需要找到它們之間的交集、並集、差集等。Java集合類提供了許多方法來幫助我們完成這些操作。其中,retainAll方法可以找到兩個集合之間的交集元素並返回。
二、使用retainAll方法的幾種方式
1.使用retainAll方法找到兩個集合中的共同元素
List<String> list1 = new ArrayList<>();
list1.add("a");
list1.add("b");
list1.add("c");
List<String> list2 = new ArrayList<>();
list2.add("b");
list2.add("c");
list2.add("d");
list1.retainAll(list2);
System.out.println(list1); // 輸出 [b, c]
以上代碼中,我們創建了兩個數組list1和list2。使用retainAll方法找到了它們的交集元素,並將結果保存在了list1中。
2.使用retainAll方法交集操作時的注意事項
在使用retainAll方法做交集操作時需要注意,由於retainAll方法是原地修改操作,即直接修改原來的列表,所以我們需要在保護原始數據的同時,避免修改到list1中不需要的元素。以下是如何正確使用retainAll方法的示例代碼:
List<String> list1 = new ArrayList<>();
list1.add("a");
list1.add("b");
list1.add("c");
List<String> list2 = new ArrayList<>();
list2.add("b");
list2.add("c");
list2.add("d");
List<String> resultList = new ArrayList<>(list1);
resultList.retainAll(list2);
System.out.println(resultList); // 輸出 [b, c]
System.out.println(list1); // 輸出 [a, b, c]
我們在這個示例代碼中創建了一個新的列表resultList,然後將list1的數據複製到resultList中,最後對resultList進行操作,這樣就保護了list1中的原始數據,避免了出現誤刪。
3.使用retainAll方法找出兩個集合的差集
用retainAll方法可以找到兩個集合的交集,那麼如何找到它們的差集呢?我們可以將它們的交集從其中一個集合中去除即可得到結果。具體實現如下:
List<String> list1 = new ArrayList<>();
list1.add("a");
list1.add("b");
list1.add("c");
List<String> list2 = new ArrayList<>();
list2.add("b");
list2.add("c");
list2.add("d");
List<String> diffList = new ArrayList<>(list1);
diffList.removeAll(list2);
System.out.println(diffList); // 輸出 [a]
以上代碼中,我們先將list1中的元素都複製到一個新的列表diffList中,然後使用removeAll方法從diffList中刪除list2中存在的元素,最終得到它們的差集。
4.使用retainAll方法交集操作時的效率問題
當我們使用retainAll方法對兩個集合做交集操作時,如果其中一個集合比另外一個集合小很多,我們可以先對其中較小的集合做一次轉換,再使用retainAll方法操作。這樣可以有效提高運行效率。
Set<String> set1 = new HashSet<>();
set1.add("a");
set1.add("b");
set1.add("c");
List<String> list2 = new ArrayList<>();
list2.add("b");
list2.add("c");
list2.add("d");
Set<String> set2 = new HashSet<>(list2);
if (set1.size() < set2.size()) {
set1.retainAll(set2);
System.out.println(set1); // 輸出 [b, c]
} else {
set2.retainAll(set1);
System.out.println(set2); // 輸出 [b, c]
}
以上代碼中,我們將list2轉換成了set2,對比set1和set2的大小,如果set1的大小小於set2,則對set1做retainAll操作。反之,對set2做retainAll操作。這樣做可以提升運行效率。
5.使用retainAll方法比較對象
retainAll方法可以比較對象,但是要保證對象的hashCode和equals方法正確實現。
class Person {
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return id == person.id &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
}
List<Person> list1 = new ArrayList<>();
list1.add(new Person(1, "Tom"));
list1.add(new Person(2, "Jack"));
list1.add(new Person(3, "Lucy"));
List<Person> list2 = new ArrayList<>();
list2.add(new Person(1, "Tom"));
list2.add(new Person(2, "Jack"));
list2.add(new Person(4, "John"));
list1.retainAll(list2);
System.out.println(list1); // 輸出 [Person{id=1, name='Tom'}, Person{id=2, name='Jack'}]
以上代碼中,我們自定義了一個Person類,並實現了其equals和hashCode方法。我們可以通過retainAll方法,比較兩個Person對象的集合。
三、總結
retainAll方法是Java集合類中非常實用的一個方法,可以幫助我們快速查找兩個集合之間的交集元素,並可以用於找到兩個集合的差集,同時還可以處理對象的比較。在使用retainAll方法時,我們需要注意保護好原始數據,以及處理好集合大小之間的問題,這樣才能讓代碼更加健壯高效。
原創文章,作者:IRJH,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/148873.html