Java求兩個 List集合的交集元素的多種實現(xiàn)方式
1. 使用 retainAll 方法
retainAll 是 Collection 接口中的一個方法,用于保留集合中與指定集合相同的元素,移除其他元素。
原理:
retainAll方法會遍歷當前集合,并檢查每個元素是否存在于指定集合中。- 如果元素不存在于指定集合中,則從當前集合中移除該元素。
- 最終,當前集合只保留與指定集合相同的元素。
retainAll 是 Java 中 List 接口提供的一個方法,用于保留列表中與指定集合中相同的元素,移除其他所有元素。換句話說,retainAll 方法會修改當前列表,使其僅包含與指定集合中相同的元素。
方法定義
boolean retainAll(Collection<?> c);
參數(shù):
c:包含需要保留元素的集合。
返回值:
- 如果列表因調(diào)用此方法而發(fā)生變化,則返回
true。 - 如果列表未發(fā)生變化(即列表已經(jīng)只包含指定集合中的元素),則返回
false。
方法行為
- 保留交集:
retainAll方法會保留當前列表與指定集合的交集。 - 移除其他元素:當前列表中不在指定集合中的元素會被移除。
- 修改原列表:
retainAll方法會直接修改當前列表,而不是返回一個新的列表。
示例代碼
以下是一個簡單的示例,展示 retainAll 方法的使用:
import java.util.ArrayList;
import java.util.List;
public class RetainAllExample {
public static void main(String[] args) {
// 創(chuàng)建兩個列表
List<String> list1 = new ArrayList<>();
list1.add("Apple");
list1.add("Banana");
list1.add("Cherry");
list1.add("Date");
List<String> list2 = new ArrayList<>();
list2.add("Banana");
list2.add("Date");
list2.add("Fig");
// 調(diào)用 retainAll 方法
boolean isChanged = list1.retainAll(list2);
// 輸出結(jié)果
System.out.println("List1 是否發(fā)生變化: " + isChanged); // true
System.out.println("List1 的內(nèi)容: " + list1); // [Banana, Date]
System.out.println("List2 的內(nèi)容: " + list2); // [Banana, Date, Fig]
}
}
輸出:
List1 是否發(fā)生變化: true List1 的內(nèi)容: [Banana, Date] List2 的內(nèi)容: [Banana, Date, Fig]
關(guān)鍵點
修改原列表:
retainAll方法會直接修改調(diào)用它的列表,而不是返回一個新的列表。- 如果需要保留原列表,可以在調(diào)用
retainAll之前創(chuàng)建一個副本。
返回值:
- 如果列表因調(diào)用
retainAll而發(fā)生變化,則返回true。 - 如果列表未發(fā)生變化(即列表已經(jīng)只包含指定集合中的元素),則返回
false。
- 如果列表因調(diào)用
集合比較:
retainAll方法依賴于equals方法來比較元素是否相同。- 如果集合中包含自定義對象,請確保正確重寫了
equals和hashCode方法。
空集合:
- 如果傳入的集合為空(
null或空集合),retainAll會拋出NullPointerException或清空當前列表。
- 如果傳入的集合為空(
注意事項
性能問題:
retainAll方法的時間復雜度取決于列表的實現(xiàn)。對于ArrayList,時間復雜度為 O(n*m),其中 n 是列表的大小,m 是集合的大小。- 如果列表和集合都很大,性能可能會受到影響。
集合類型:
retainAll方法可以接受任何實現(xiàn)了Collection接口的對象作為參數(shù),例如List、Set等。
元素重復:
- 如果列表中有重復元素,而指定集合中沒有重復元素,
retainAll會保留列表中的重復元素。 - 例如:
- 如果列表中有重復元素,而指定集合中沒有重復元素,
List<String> list1 = new ArrayList<>(List.of("A", "A", "B", "C"));
List<String> list2 = new ArrayList<>(List.of("A", "B"));
list1.retainAll(list2);
System.out.println(list1); // 輸出 [A, A, B]
注:
retainAll方法用于保留列表中與指定集合中相同的元素,移除其他元素。- 它會直接修改原列表,并返回一個布爾值表示列表是否發(fā)生變化。
- 使用時需要注意性能問題和集合類型的兼容性。
- 如果需要保留原列表,可以在調(diào)用
retainAll之前創(chuàng)建一個副本。
2. 使用 Stream API
Java 8 引入了 Stream API,可以方便地對集合進行操作。
原理:
- 使用
stream()方法將List轉(zhuǎn)換為流。 - 使用
filter方法過濾出存在于另一個集合中的元素。 - 使用
collect方法將結(jié)果收集到一個新的List中。
示例代碼:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
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);
list2.add(4);
List<Integer> intersection = list1.stream()
.filter(list2::contains)
.collect(Collectors.toList());
System.out.println(intersection); // 輸出: [2, 3]
}
}
3. 手動遍歷
手動遍歷兩個 List,并找出共同的元素。
原理:
- 遍歷第一個
List中的每個元素。 - 檢查該元素是否存在于第二個
List中。 - 如果存在,則將其添加到結(jié)果集合中。
示例代碼:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
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);
list2.add(4);
List<Integer> intersection = new ArrayList<>();
for (Integer item : list1) {
if (list2.contains(item)) {
intersection.add(item);
}
}
System.out.println(intersection); // 輸出: [2, 3]
}
}
總結(jié)
retainAll方法是最直接的方式,但會修改原始集合。StreamAPI 提供了更靈活和函數(shù)式的編程方式,且不會修改原始集合。- 手動遍歷適用于需要自定義邏輯的場景,但代碼量較多。
根據(jù)具體需求選擇合適的方法即可。
到此這篇關(guān)于Java求兩個 List集合的交集元素的多種實現(xiàn)方式的文章就介紹到這了,更多相關(guān)Java兩個 List集合交集元素內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用@AllArgsConstructor和final 代替 @Autowired
這篇文章主要介紹了使用@AllArgsConstructor和final 代替 @Autowired方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))
這篇文章主要介紹了Spring框架花式創(chuàng)建Bean的n種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
關(guān)于Mybatis-Plus?Update更新策略問題
這篇文章主要介紹了關(guān)于Mybatis-Plus?Update更新策略問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
java Map轉(zhuǎn)Object與Object轉(zhuǎn)Map實現(xiàn)代碼
這篇文章主要介紹了 java Map轉(zhuǎn)Object與Object轉(zhuǎn)Map實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
SpringBoot之HandlerInterceptor攔截器的使用詳解
這篇文章主要介紹了SpringBoot之HandlerInterceptor攔截器的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10

