Java求兩個 List集合的交集元素的多種實現(xiàn)方式
1. 使用 retainAll 方法
retainAll
是 Collection
接口中的一個方法,用于保留集合中與指定集合相同的元素,移除其他元素。
原理:
retainAll
方法會遍歷當(dāng)前集合,并檢查每個元素是否存在于指定集合中。- 如果元素不存在于指定集合中,則從當(dāng)前集合中移除該元素。
- 最終,當(dāng)前集合只保留與指定集合相同的元素。
retainAll
是 Java 中 List
接口提供的一個方法,用于保留列表中與指定集合中相同的元素,移除其他所有元素。換句話說,retainAll
方法會修改當(dāng)前列表,使其僅包含與指定集合中相同的元素。
方法定義
boolean retainAll(Collection<?> c);
參數(shù):
c
:包含需要保留元素的集合。
返回值:
- 如果列表因調(diào)用此方法而發(fā)生變化,則返回
true
。 - 如果列表未發(fā)生變化(即列表已經(jīng)只包含指定集合中的元素),則返回
false
。
方法行為
- 保留交集:
retainAll
方法會保留當(dāng)前列表與指定集合的交集。 - 移除其他元素:當(dāng)前列表中不在指定集合中的元素會被移除。
- 修改原列表:
retainAll
方法會直接修改當(dāng)前列表,而不是返回一個新的列表。
示例代碼
以下是一個簡單的示例,展示 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
或清空當(dāng)前列表。
- 如果傳入的集合為空(
注意事項
性能問題:
retainAll
方法的時間復(fù)雜度取決于列表的實現(xiàn)。對于ArrayList
,時間復(fù)雜度為 O(n*m),其中 n 是列表的大小,m 是集合的大小。- 如果列表和集合都很大,性能可能會受到影響。
集合類型:
retainAll
方法可以接受任何實現(xiàn)了Collection
接口的對象作為參數(shù),例如List
、Set
等。
元素重復(fù):
- 如果列表中有重復(fù)元素,而指定集合中沒有重復(fù)元素,
retainAll
會保留列表中的重復(fù)元素。 - 例如:
- 如果列表中有重復(fù)元素,而指定集合中沒有重復(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
方法用于保留列表中與指定集合中相同的元素,移除其他元素。- 它會直接修改原列表,并返回一個布爾值表示列表是否發(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
方法是最直接的方式,但會修改原始集合。Stream
API 提供了更靈活和函數(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-09Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))
這篇文章主要介紹了Spring框架花式創(chuàng)建Bean的n種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03關(guān)于Mybatis-Plus?Update更新策略問題
這篇文章主要介紹了關(guān)于Mybatis-Plus?Update更新策略問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11java 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-02SpringBoot之HandlerInterceptor攔截器的使用詳解
這篇文章主要介紹了SpringBoot之HandlerInterceptor攔截器的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10