欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java求兩個(gè) List集合的交集元素的多種實(shí)現(xiàn)方式

 更新時(shí)間:2025年05月21日 10:05:38   作者:冰糖心書(shū)房  
在 Java 中,求兩個(gè) List 的交集元素可以通過(guò)多種方式實(shí)現(xiàn),常見(jiàn)的做法包括使用 retainAll 方法、Stream API 或手動(dòng)遍歷,以下是這些方法的原理和實(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)

  1. 修改原列表

    • retainAll 方法會(huì)直接修改調(diào)用它的列表,而不是返回一個(gè)新的列表。
    • 如果需要保留原列表,可以在調(diào)用 retainAll 之前創(chuàng)建一個(gè)副本。
  2. 返回值

    • 如果列表因調(diào)用 retainAll 而發(fā)生變化,則返回 true
    • 如果列表未發(fā)生變化(即列表已經(jīng)只包含指定集合中的元素),則返回 false
  3. 集合比較

    • retainAll 方法依賴(lài)于 equals 方法來(lái)比較元素是否相同。
    • 如果集合中包含自定義對(duì)象,請(qǐng)確保正確重寫(xiě)了 equals 和 hashCode 方法。
  4. 空集合

    • 如果傳入的集合為空(null 或空集合),retainAll 會(huì)拋出 NullPointerException 或清空當(dāng)前列表。

注意事項(xiàng)

  1. 性能問(wèn)題

    • retainAll 方法的時(shí)間復(fù)雜度取決于列表的實(shí)現(xiàn)。對(duì)于 ArrayList,時(shí)間復(fù)雜度為 O(n*m),其中 n 是列表的大小,m 是集合的大小。
    • 如果列表和集合都很大,性能可能會(huì)受到影響。
  2. 集合類(lèi)型

    • retainAll 方法可以接受任何實(shí)現(xiàn)了 Collection 接口的對(duì)象作為參數(shù),例如 List、Set 等。
  3. 元素重復(fù)

    • 如果列表中有重復(fù)元素,而指定集合中沒(méi)有重復(fù)元素,retainAll 會(huì)保留列表中的重復(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)文章

  • Hibernate緩存機(jī)制實(shí)例代碼解析

    Hibernate緩存機(jī)制實(shí)例代碼解析

    這篇文章主要介紹了Hibernate緩存機(jī)制實(shí)例代碼解析,介紹了查詢緩存,一級(jí)二級(jí)緩存等內(nèi)容,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • 如何使用@AllArgsConstructor和final 代替 @Autowired

    如何使用@AllArgsConstructor和final 代替 @Autowired

    這篇文章主要介紹了使用@AllArgsConstructor和final 代替 @Autowired方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))

    Spring框架花式創(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-03
  • Easycode自動(dòng)化springboot的curd

    Easycode自動(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)題

    這篇文章主要介紹了關(guān)于Mybatis-Plus?Update更新策略問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 分析Java中為什么String不可變

    分析Java中為什么String不可變

    Java中為什么String是不可變性的。今天我們從多角度解析為什么Java把String做成不可變的。
    2021-06-06
  • java Map轉(zhuǎn)Object與Object轉(zhuǎn)Map實(shí)現(xiàn)代碼

    java 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-02
  • Java中csv文件讀寫(xiě)超詳細(xì)分析

    Java中csv文件讀寫(xiě)超詳細(xì)分析

    CSV是一種通用的、相對(duì)簡(jiǎn)單的文件格式,其文件以純文本形式存儲(chǔ)表格數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Java中csv文件讀寫(xiě)分析的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • SpringBoot之HandlerInterceptor攔截器的使用詳解

    SpringBoot之HandlerInterceptor攔截器的使用詳解

    這篇文章主要介紹了SpringBoot之HandlerInterceptor攔截器的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java前后端分離項(xiàng)目跨域問(wèn)題解決方案

    Java前后端分離項(xiàng)目跨域問(wèn)題解決方案

    本文主要介紹了Java前后端分離項(xiàng)目跨域問(wèn)題解決方案,其中后端基于SpringBoot,前端使用了jQuery、axios等框架,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03

最新評(píng)論