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

java兩個(gè)List的交集,并集方式

 更新時(shí)間:2025年03月06日 15:59:30   作者:cxyhl  
文章主要介紹了Java中兩個(gè)List的交集和并集的處理方法,推薦使用Apache的CollectionUtils工具類,因?yàn)樗?jiǎn)單且不會(huì)改變?cè)屑?同時(shí),文章還討論了Arrays.asList的局限性和JDK1.8中Stream新特性的使用

java兩個(gè)List的交集,并集

方法一

  • 使用apache的CollectionUtils工具類(推薦)
public static void main(String[] args) {

    String[] arrayA = new String[] { "1", "2", "3", "4"};
    String[] arrayB = new String[] { "3", "4", "5", "6" };
    List<String> listA = Arrays.asList(arrayA);
    List<String> listB = Arrays.asList(arrayB);

    //1、并集 union
    System.out.println(CollectionUtils.union(listA, listB));
    //輸出: [1, 2, 3, 4, 5, 6]

    //2、交集 intersection
    System.out.println(CollectionUtils.intersection(listA, listB));
    //輸出:[3, 4]

    //3、交集的補(bǔ)集(析?。ヾisjunction
    System.out.println(CollectionUtils.disjunction(listA, listB));
    //輸出:[1, 2, 5, 6]

    //4、差集(扣除)
    System.out.println(CollectionUtils.subtract(listA, listB));
    //輸出:[1, 2]
}

方法二

  • List自帶方法
public static void main(String[] args) {

    String[] arrayA = new String[] { "1", "2", "3", "4"};
    String[] arrayB = new String[] { "3", "4", "5", "6" };
    List<String> listA = Arrays.asList(arrayA);
    List<String> listB = Arrays.asList(arrayB);

    //1、交集
    List<String>  jiaoList = new ArrayList<>(listA);
    jiaoList.retainAll(listB);
    System.out.println(jiaoList);
    //輸出:[3, 4]

    //2、差集
    List<String>  chaList = new ArrayList<>(listA);
    chaList.removeAll(listB);
    System.out.println(chaList);
    //輸出:[1, 2]

    //3、并集 (先做差集再做添加所有)
    List<String>  bingList = new ArrayList<>(listA);
    bingList.removeAll(listB); // bingList為 [1, 2]
    bingList.addAll(listB);  //添加[3,4,5,6]
    System.out.println(bingList);
    //輸出:[1, 2, 3, 4, 5, 6]
}

注意 : intersection和retainAll的差別

要注意的是它們的返回類型是不一樣的,intersection返回的是一個(gè)新的List集合,而retainAll返回是Bollean類型那就說(shuō)明retainAll方法是對(duì)原有集合進(jìn)行處理再返回原有集合,會(huì)改變?cè)屑现械膬?nèi)容。

個(gè)人觀點(diǎn):

1、從性能角度來(lái)考慮的話,List自帶會(huì)高點(diǎn),因?yàn)樗挥迷賱?chuàng)建新的集合。

2、需要注意的是:因?yàn)閞etainAll因?yàn)闀?huì)改變?cè)屑?所以該集合需要多次使用就不適合用retainAll。

注意:

Arrays.asList將數(shù)組轉(zhuǎn)集合不能進(jìn)行add和remove操作。

原因:

調(diào)用Arrays.asList()生產(chǎn)的List的add、remove方法時(shí)報(bào)異常,這是由Arrays.asList() 返回的市Arrays的內(nèi)部類ArrayList, 而不是java.util.ArrayList。

Arrays的內(nèi)部類ArrayList和java.util.ArrayList都是繼承AbstractList,remove、add等方法AbstractList中是默認(rèn)throw UnsupportedOperationException而且不作任何操作。

java.util.ArrayList重新了這些方法而Arrays的內(nèi)部類ArrayList沒(méi)有重新,所以會(huì)拋出異常。

  • 所以正確做法如下
String[] array = {"1","2","3","4","5"};
List<String> list = Arrays.asList(array);
List arrList = new ArrayList(list);
arrList.add("6");

方法三

JDK1.8 stream 新特性

String[] arrayA = new String[] { "1", "2", "3", "4"};
    String[] arrayB = new String[] { "3", "4", "5", "6" };
    List<String> listA = Arrays.asList(arrayA);
    List<String> listB = Arrays.asList(arrayB);

    // 交集
    List<String> intersection = listA.stream().filter(item -> listB.contains(item)).collect(toList());
    System.out.println(intersection);
    //輸出:[3, 4]

    // 差集 (list1 - list2)
    List<String> reduceList = listA.stream().filter(item -> !listB.contains(item)).collect(toList());
    System.out.println(reduceList);
    //輸出:[1, 2]

    // 并集 (新建集合:1、是因?yàn)椴挥绊懺技稀?、Arrays.asList不能add和remove操作。
    List<String> listAll = listA.parallelStream().collect(toList());
    List<String> listAll2 = listB.parallelStream().collect(toList());
    listAll.addAll(listAll2);
    System.out.println(listAll);
    //輸出:[1, 2, 3, 4, 3, 4, 5, 6]

    // 去重并集
    List<String> list =new ArrayList<>(listA);
    list.addAll(listB);
    List<String> listAllDistinct = list.stream().distinct().collect(toList());
    System.out.println(listAllDistinct);
    //輸出:[1, 2, 3, 4, 5, 6]

總結(jié) : 這三種推薦第一種方式,因?yàn)榈诙N還需要確定該集合是否被多次調(diào)用。第三種可讀性不高。

對(duì)象集合交、并、差處理

因?yàn)閷?duì)象的equels比較是比較兩個(gè)對(duì)象的內(nèi)存地址,所以除非是同一對(duì)象,否則equel返回永遠(yuǎn)是false。

但我們實(shí)際開(kāi)發(fā)中 在我們的業(yè)務(wù)系統(tǒng)中判斷對(duì)象時(shí)有時(shí)候需要的不是一種嚴(yán)格意義上的相等,而是一種業(yè)務(wù)上的對(duì)象相等。在這種情況下,原生的equals方法就不能滿足我們的需求了,所以這個(gè)時(shí)候我們需要重寫(xiě)equals方法。

說(shuō)明 :String為什么可以使用equels方法為什么只要字符串相等就為true,那是因?yàn)镾tring類重寫(xiě)了equal和hashCode方法,比較的是值。

public class Person {
    private String name;
    private Integer age;
    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    /**
     * 為什么重寫(xiě)equals方法一定要重寫(xiě)hashCode方法下面也會(huì)講
     */
    @Override
    public int hashCode() {
        String result = name + age;
        return result.hashCode();
    }
    /**
     * 重寫(xiě) equals 方法 根據(jù)name和age都相同那么對(duì)象就默認(rèn)相同
     */
    @Override
    public boolean equals(Object obj) {
        Person u = (Person) obj;
        return this.getName().equals(u.getName()) && (this.age.equals(u.getAge()));
    }
    /**
     * 重寫(xiě) toString 方法
     */
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
  }

這里根據(jù)name和age都相同那么就默認(rèn)相同對(duì)象。

public static void main(String[] args) {

        List<Person> personList = Lists.newArrayList();
        Person person1 = new Person("小小",3);
        Person person2 = new Person("中中",4);
        personList.add(person1);
        personList.add(person2);

        List<Person> person1List = Lists.newArrayList();
        Person person3 = new Person("中中",4);
        Person person4 = new Person("大大",5);
        person1List.add(person3);
        person1List.add(person4);
        /**
         * 1、差集
         */
        System.out.println(CollectionUtils.subtract(personList, person1List));
        //輸出:[Person{name='小小', age=3}]

        /**
         * 2、并集
         */
        System.out.println(CollectionUtils.union(personList, person1List));
        //輸出:[Person{name='小小', age=3}, Person{name='中中', age=4}, Person{name='大大', age=5}]

        /**
         * 3、交集
         */
        System.out.println(CollectionUtils.intersection(personList, person1List));
        //輸出:[Person{name='中中', age=4}]

        /**
         * 4、交集的補(bǔ)集(析?。?
         */
        System.out.println(CollectionUtils.disjunction(personList, person1List));
        //輸出:[Person{name='小小', age=3}, Person{name='大大', age=5}]
    }

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot中@Autowired與@Resource的區(qū)別小結(jié)

    SpringBoot中@Autowired與@Resource的區(qū)別小結(jié)

    本文主要介紹了SpringBoot中@Autowired與@Resource的區(qū)別小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • 教你用JAVA寫(xiě)文本編輯器(二)

    教你用JAVA寫(xiě)文本編輯器(二)

    之前介紹了JAVA寫(xiě)文本編輯器的基本思路,下面這篇文章就來(lái)給大家介紹了關(guān)于用JAVA寫(xiě)文本編輯器的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • Spring Boot 利用WebUploader進(jìn)行文件上傳功能

    Spring Boot 利用WebUploader進(jìn)行文件上傳功能

    本文的重點(diǎn)是給大家介紹在Spring Boot項(xiàng)目中利用WebUploader如何進(jìn)行文件上傳,本文通過(guò)示例代碼給大家介紹,需要的朋友參考下吧
    2018-03-03
  • 基于bufferedreader的read()與readline()讀取出錯(cuò)原因及解決

    基于bufferedreader的read()與readline()讀取出錯(cuò)原因及解決

    這篇文章主要介紹了bufferedreader的read()與readline()讀取出錯(cuò)原因及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 使用aop實(shí)現(xiàn)全局異常處理

    使用aop實(shí)現(xiàn)全局異常處理

    這篇文章主要為大家詳細(xì)介紹了使用aop實(shí)現(xiàn)全局異常處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置

    Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置

    Hutool是一個(gè)Java基礎(chǔ)工具類,對(duì)文件、流、加密解密、轉(zhuǎn)碼、正則、線程、XML等JDK方法進(jìn)行封裝,組成各種Util工具類,這篇文章主要給大家介紹了關(guān)于Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 解決idea web項(xiàng)目中out目錄更新不同步問(wèn)題

    解決idea web項(xiàng)目中out目錄更新不同步問(wèn)題

    這篇文章給大家介紹了idea web項(xiàng)目中out(maven中是target)目錄更新不同步,導(dǎo)致訪問(wèn)404的問(wèn)題,本文給大家分享解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • SpringBoot實(shí)現(xiàn)郵件發(fā)送的完整解決方案(附件發(fā)送、內(nèi)嵌圖片與中文亂碼處理)

    SpringBoot實(shí)現(xiàn)郵件發(fā)送的完整解決方案(附件發(fā)送、內(nèi)嵌圖片與中文亂碼處理)

    本文基于 Spring Boot 2.x + JDK 1.8 + Jakarta Mail 1.6.2,提供生產(chǎn)環(huán)境可用的完整郵件發(fā)送解決方案,涵蓋附件發(fā)送、內(nèi)嵌圖片、中文亂碼處理等核心場(chǎng)景,需要的朋友可以參考下
    2026-02-02
  • 將Java程序打包成EXE文件的實(shí)現(xiàn)方式

    將Java程序打包成EXE文件的實(shí)現(xiàn)方式

    這篇文章主要介紹了將Java程序打包成EXE文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 一文詳解Java如何防止DDoS攻擊

    一文詳解Java如何防止DDoS攻擊

    DDoS(分布式拒絕服務(wù))攻擊是一種常見(jiàn)的網(wǎng)絡(luò)攻擊手段在?Java?應(yīng)用開(kāi)發(fā)中,了解?DDoS?攻擊的原理和防御策略至關(guān)重要,下面小編來(lái)和大家詳細(xì)講講
    2025-05-05

最新評(píng)論

华池县| 吴堡县| 扎鲁特旗| 赤城县| 东乡县| 武功县| 铜山县| 武义县| 溧阳市| 岗巴县| 庆城县| 博兴县| 绍兴市| 建平县| 松江区| 通州区| 丹巴县| 启东市| 晋州市| 临沧市| 丰顺县| 湖州市| 类乌齐县| 和田县| 通山县| 宁晋县| 库车县| 贵阳市| 柘荣县| 西乌| 靖安县| 万全县| 包头市| 河源市| 乡城县| 昆明市| 延庆县| 门头沟区| 商河县| 疏勒县| 古丈县|