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