最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?List集合取交集的8種不同實現(xiàn)方式總結(jié)

 更新時間:2024年04月13日 15:30:54   作者:碼到三十五  
工作中經(jīng)常遇到需要取兩個集合之間的交集、差集情況,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Java?List集合取交集的8種不同實現(xiàn)方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

方法一:使用Java 8的Stream API

這種方法利用Stream API的filter和collect操作來找到兩個列表的交集。

List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

List<Integer> intersection = list1.stream()
        .filter(list2::contains)
        .collect(Collectors.toList());

方法二:使用傳統(tǒng)的for循環(huán)遍歷

這種方法通過遍歷一個列表,并檢查其元素是否存在于另一個列表中來實現(xiàn)交集。

List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
List<Integer> intersection = new ArrayList<>();

for (Integer item : list1) {
    if (list2.contains(item)) {
        intersection.add(item);
    }
}

使用HashSet優(yōu)化遍歷方法:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ListIntersection {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

        Set<Integer> set1 = new HashSet<>(list1);
        List<Integer> intersection = new ArrayList<>();

        for (Integer num : list2) {
            if (set1.contains(num)) {
                intersection.add(num);
            }
        }

        System.out.println("交集:" + intersection);
    }
}

list1轉(zhuǎn)換為HashSet,以提高查找效率。然后,我們遍歷list2,并檢查其元素是否存在于set1中。如果存在,則將其添加到交集列表中。請注意,由于HashSet不保證元素的順序,因此交集列表中的元素順序可能與原始列表不同。如果需要保持順序,可以使用LinkedHashSet代替HashSet。

方法三:使用Set的retainAll方法

這種方法首先將兩個列表轉(zhuǎn)換為Set,然后利用Set的retainAll方法來找到交集。retainAll方法會保留在指定集合(參數(shù))中存在的元素。

List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

Set<Integer> set1 = new HashSet<>(list1);
Set<Integer> set2 = new HashSet<>(list2);
set1.retainAll(set2); // set1現(xiàn)在只包含交集元素

List<Integer> intersection = new ArrayList<>(set1);

方法四:使用Java的CollectionUtils(Apache Commons Collections)

如果你的項目中已經(jīng)包含了Apache Commons Collections庫,你可以使用其提供的CollectionUtils類來方便地找到交集。

import org.apache.commons.collections4.CollectionUtils;

List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

List<Integer> intersection = (List<Integer>) CollectionUtils.intersection(list1, list2);

注意:Apache Commons Collections庫中的intersection方法返回的是java.util.Collection類型,所以需要進(jìn)行類型轉(zhuǎn)換。

方法五:使用Java Stream API的anyMatch

之前已經(jīng)用filter方法展示了如何使用Stream API找交集,但其實也可以用anyMatch來實現(xiàn)類似的功能。不過,這種方法通常不是最高效的,因為它需要對每個元素進(jìn)行遍歷檢查。

List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

List<Integer> intersection = list1.stream()
    .filter(item -> list2.stream().anyMatch(item::equals))
    .collect(Collectors.toList());

注意:這種方法的時間復(fù)雜度較高,因為對于list1中的每個元素,它都會遍歷整個list2。因此,對于大型列表,這種方法不推薦使用。

方法六:使用Java 8的并行流(Parallel Streams)

如果列表很大,并且你的機(jī)器有多個處理器核心,你可以考慮使用并行流來加速交集的計算。

List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

Set<Integer> set2 = new HashSet<>(list2); // 使用HashSet提高查找效率

List<Integer> intersection = list1.parallelStream()
    .filter(set2::contains)
    .collect(Collectors.toList());

注意:并行流并不總是比順序流更快,特別是在處理小數(shù)據(jù)集或數(shù)據(jù)集不適合并行處理時。此外,并行流的使用也會增加線程的開銷。

方法七:使用Java的并發(fā)工具類

如果你在處理非常大的數(shù)據(jù)集,并且希望利用多核處理器的能力,你可以考慮使用Java的并發(fā)工具類,如ForkJoinPool,來并行計算交集。

這種方法比較復(fù)雜,通常用于高級并發(fā)編程場景?;舅悸肥菍⒋笕蝿?wù)拆分成小任務(wù),然后使用ForkJoinPool來并行處理這些小任務(wù),并最終合并結(jié)果。

方法八:使用第三方庫(如Guava)

除了Apache Commons Collections,還有其他第三方庫如Guava也提供了集合操作的工具類。

例如,使用Guava的Sets.intersection(Set<E> set1, Set<E> set2)方法可以很容易地找到兩個集合的交集:

import com.google.common.collect.Sets;

List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);

Set<Integer> set1 = new HashSet<>(list1);
Set<Integer> set2 = new HashSet<>(list2);

Set<Integer> intersectionSet = Sets.intersection(set1, set2);
List<Integer> intersection = new ArrayList<>(intersectionSet);

注意:Guava的Sets.intersection方法返回的是一個不可修改的視圖,它表示兩個原始集合的交集。這個視圖會隨著原始集合的變化而變化,但它本身不占用額外的空間。如果你需要一個獨立的交集集合,可以像上面那樣將其復(fù)制到一個新的ArrayList中。

通過以上方法的介紹和實踐,希望能夠幫助你更好地理解Java中List集合交集的計算,并能夠在實際開發(fā)中靈活運用。

附:Java兩個較大的List快速取交集

public static void main(String[] args) {
        //模擬數(shù)據(jù)
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        for (int i = 1; i <= 1000000; i++) {
            list1.add(i);
            list2.add(1000000 - i);
        }
        //記錄開始時間
        long startTime = System.currentTimeMillis();
        //最后結(jié)果集
        List<Integer> resultList = new ArrayList<>();
        //中間存儲
        Map<String, Integer> map = new HashMap<>();

        list2.forEach(i2 -> {
            map.put(i2 + "", i2);
        });

        list1.forEach(i1 -> {
            Integer m = map.get(i1 + "");
            //如果不為空,則證明list1和list2都擁有該數(shù)據(jù)
            if (m != null) {
                resultList.add(i1);
            }
        });
        System.out.println("耗時:" + (System.currentTimeMillis() - startTime) + "ms");
        System.out.println(resultList.size());
    } 

運行結(jié)果 

總結(jié)

到此這篇關(guān)于Java List集合取交集的8種不同實現(xiàn)方式的文章就介紹到這了,更多相關(guān)Java List集合取交集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于java查找最長字符串代碼實例

    基于java查找最長字符串代碼實例

    這篇文章主要介紹了基于java查找最長字符串代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • springboot集成測試最小化依賴實踐示例

    springboot集成測試最小化依賴實踐示例

    這篇文章主要為大家介紹了springboot集成測試最小化依賴實踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Spring實現(xiàn)源碼下載編譯及導(dǎo)入IDEA過程圖解

    Spring實現(xiàn)源碼下載編譯及導(dǎo)入IDEA過程圖解

    這篇文章主要介紹了Spring實現(xiàn)源碼下載編譯及導(dǎo)入IDEA,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • IntelliJ IDEA 如何徹底刪除項目的步驟

    IntelliJ IDEA 如何徹底刪除項目的步驟

    本篇文章主要介紹了IntelliJ IDEA 如何徹底刪除項目的步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Idea配置maven-tomcat-plugin插件實現(xiàn)項目部署

    Idea配置maven-tomcat-plugin插件實現(xiàn)項目部署

    今天小編就為大家分享一篇關(guān)于Idea配置maven-tomcat-plugin插件實現(xiàn)項目部署,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • java線程之死鎖

    java線程之死鎖

    這篇文章主要介紹了Java線程之死鎖,死鎖是這樣一種情形-多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由于線程被無限期地阻塞,因此程序不可能正常終止
    2022-05-05
  • mybatis-plus多表聯(lián)查join的實現(xiàn)

    mybatis-plus多表聯(lián)查join的實現(xiàn)

    本文主要介紹了mybatis-plus多表聯(lián)查join的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Java常用排序算法及性能測試集合

    Java常用排序算法及性能測試集合

    周末天氣不好,在家無事,把常用排序算法理了一遍,收獲不小,特寫文章紀(jì)念。這些算法在學(xué)校的時候?qū)W過一遍,很多原理都忘記了
    2013-06-06
  • Eclipse IDE可支持Java 14編程

    Eclipse IDE可支持Java 14編程

    這篇文章主要介紹了Eclipse IDE可支持Java 14編程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07

最新評論

华池县| 象山县| 贺州市| 武胜县| 葫芦岛市| 水城县| 台南县| 密云县| 定襄县| 徐汇区| 鄂伦春自治旗| 鄂托克旗| 杨浦区| 阿巴嘎旗| 海城市| 称多县| 正定县| 玉门市| 宁武县| 双江| 常山县| 故城县| 牟定县| 蕲春县| 襄樊市| 沅江市| 古丈县| 双牌县| 临汾市| 亚东县| 周宁县| 新河县| 巴塘县| 新巴尔虎左旗| 扎鲁特旗| 迭部县| 青川县| 大洼县| 苍山县| 公主岭市| 平江县|