集合和数组的相关操作

本文详细介绍了Java中如何将数组转换为集合(包括引用类型和基础类型),以及集合之间的相交操作、获取交集的方法,还涵盖了集合转为字符串的示例。重点展示了Arrays.asList、newArrayList<>(Arrays.asList)和Collections.addAll等转换方法的异同。
摘要由CSDN通过智能技术生成

目录

1.数组转集合(引用类型数组)

2.数组转集合(基础类型数组)

3.集合转数组

4.集合之间是否相交

5.获取两个集合的交集

6.集合转为字符串


1.数组转集合(引用类型数组)

(1)Arrays.asList

示例:

String[] colArr = new String[6];
        colArr[0] = "1";
        colArr[1] = "2";
        colArr[2] = "3";
        colArr[3] = "4";
        colArr[4] = "5";
        List<String> strings1 = Arrays.asList(colArr);
        // 集合大小
        System.out.println("集合大小:"+strings1.size());
        System.out.println("集合1修改前:"+strings1);
        colArr[5] = "6";
        colArr[4] = "44";
        // 数组修改集合也会修改,是浅拷贝的方式,底层共用一个内存地址
        System.out.println("集合1修改后:"+strings1);
        // 集合改变数组也会改变
        // 修改前的数组
        System.out.println("修改前的数组:"+colArr[0]);
        strings1.set(0,"11");
        System.out.println("修改后的数组:"+colArr[0]);
        // 转换后的集合不能进行删除
        strings1.remove(0);
        // Exception in thread "main" java.lang.UnsupportedOperationException
        // at java.util.AbstractList.remove(AbstractList.java:161)
        // at com.kingagroot.info.em.Test1.main(Test1.java:28)

        // 转换后的集合不能进行添加
        strings1.add("77");
        // 报错如下:
        // Exception in thread "main" java.lang.UnsupportedOperationException
        // at java.util.AbstractList.add(AbstractList.java:148)
        // at java.util.AbstractList.add(AbstractList.java:108)
        // at com.kingagroot.info.em.Test1.main(Test1.java:28)

执行结果:

集合大小:6
集合1修改前:[1, 2, 3, 4, 5, null]
集合1修改后:[1, 2, 3, 4, 44, 6]
修改前的数组:1
修改后的数组:11

说明:

①使用Arrays.asList方法将数组转为集合

②转换前的数组和转换后的集合共用一个内存地址,数组中的元素改变,集合中的元素也会同时发生变化;反之,集合中元素改变,数组也同时发生变化。

③转换后的集合不能进行删除和增加,阅读源码可以发现,执行asList方法,会new一个ArrayList,这是Arrays的一个静态内部类,继承了AbstractList,AbstractList是不支持进行删除和增加的。

(2)new ArrayList<>(Arrays.asList(arr))

示例:

        String[] colArr = new String[6];
        colArr[0] = "1";
        colArr[1] = "2";
        colArr[2] = "3";
        colArr[3] = "4";
        colArr[4] = "5";
        List<String> strings1 = new ArrayList<>(Arrays.asList(colArr));
        // 集合大小
        System.out.println("集合大小:"+strings1.size());
        System.out.println("集合1修改前:"+strings1);
        colArr[5] = "6";
        colArr[4] = "44";
        // 数组修改集合不会修改
        System.out.println("集合1修改后:"+strings1);
        // 集合修改数组不会修改
        // 修改前的数组
        System.out.println("修改前的数组:"+colArr[0]);
        strings1.set(0,"11");
        System.out.println("修改后的数组:"+colArr[0]);
        // 转换后的集合能进行删除
        strings1.remove(0);
        System.out.println("删除后的集合:"+strings1);
        // 转换后的集合能进行添加
        strings1.add("77");
        System.out.println("增加后的集合:"+strings1);

执行结果:

集合大小:6
集合1修改前:[1, 2, 3, 4, 5, null]
集合1修改后:[1, 2, 3, 4, 5, null]
修改前的数组:1
修改后的数组:1
删除后的集合:[2, 3, 4, 5, null]
增加后的集合:[2, 3, 4, 5, null, 77]

 说明:

①使用new ArrayList<>(Arrays.asList(arr))将数组转为集合

②通过new的方式,数组修改,转换后的集合不会修改,反之也是如此

③转换后的集合可以进行删除和增加

(3)Collections.addAll

示例:

        String[] colArr = new String[6];
        colArr[0] = "1";
        colArr[1] = "2";
        colArr[2] = "3";
        colArr[3] = "4";
        colArr[4] = "5";
        List<String> strings1 = new ArrayList<>();
        Collections.addAll(strings1,colArr);
        // 集合大小
        System.out.println("集合大小:"+strings1.size());
        System.out.println("集合1修改前:"+strings1);
        colArr[5] = "6";
        colArr[4] = "44";
        // 数组修改集合不会修改
        System.out.println("集合1修改后:"+strings1);
        // 集合修改数组不会修改
        // 修改前的数组
        System.out.println("修改前的数组:"+colArr[0]);
        strings1.set(0,"11");
        System.out.println("修改后的数组:"+colArr[0]);
        // 转换后的集合能进行删除
        strings1.remove(0);
        System.out.println("删除后的集合:"+strings1);
        // 转换后的集合能进行添加
        strings1.add("77");
        System.out.println("增加后的集合:"+strings1);

执行结果:

集合大小:6
集合1修改前:[1, 2, 3, 4, 5, null]
集合1修改后:[1, 2, 3, 4, 5, null]
修改前的数组:1
修改后的数组:1
删除后的集合:[2, 3, 4, 5, null]
增加后的集合:[2, 3, 4, 5, null, 77]

说明:

①其原理就是循环数组,将数组的所有元素添加到集合中。

②通过new的方式创建,所有数组和集合使用不同的内存地址,一方改变,另一方不会发生变化。

③转换后的集合可以进行修改和增加。

2.数组转集合(基础类型数组)

(1)Arrays.asList

示例:

        int[] colArr = new int[6];
        colArr[0] = 1;
        colArr[1] = 2;
        colArr[2] = 3;
        colArr[3] = 4;
        colArr[4] = 5;

        List<int[]> ints = Arrays.asList(colArr);
        System.out.println("数组大小:" + ints.size());
        System.out.println("数组内容:" + ints.get(0));

执行结果:

数组大小:1
数组内容:[I@4361bd48

说明:

①基础数据类型的数组转换后,是基础数据类型数组的集合,集合中只有一个人元素,就是数组。

②基础类型不能用作泛型,源码中的a接收引用类型。

    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

③如果要生成每个数组元素的集合,参照(2)的方式,使用基础数据类型的包装类

(2)Arrays.asList

示例:

        Integer[] colArr = new Integer[6];
        colArr[0] = 1;
        colArr[1] = 2;
        colArr[2] = 3;
        colArr[3] = 4;
        colArr[4] = 5;

        List<Integer> ints = Arrays.asList(colArr);
        System.out.println("数组大小:" + ints.size());
        System.out.println("数组内容:" + ints);

执行结果:

数组大小:6
数组内容:[1, 2, 3, 4, 5, null]

说明:

①使用基础类型的包装类作为数组的类型,可以生成每个数组元素的集合类

3.集合转数组

示例:

        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        String[] strArr = list.toArray(new String[list.size()]);
        System.out.println("修改前数组:" + strArr.length);
        // 集合改变数组不会发生变化
        list.add("7");
        System.out.println("修改后数组:" + strArr.length);
        // 数组中元素的内容可以改变
        strArr[0] = "11";
        System.out.println(strArr[0]);

执行结果:

修改前数组:6
修改后数组:6
11

说明:

①使用list.toArray方法

②集合改变后数组不会随之改变 

参照:https://blog.51cto.com/liuchenyang0515/6422343

4.集合之间是否相交

示例:

List<String> list1 = new ArrayList<>(Arrays.asList("1", "2", "3", "4", "5", "6", "7"));
        List<String> list2 = new ArrayList<>(Arrays.asList("1", "2", "33", "44", "55", "6", "7"));
        List<String> list3 = new ArrayList<>(Arrays.asList("11", "22", "33", "44", "55", "66", "77"));
        // 方法1 使用Collections.disjoint,没有交集返回true,有交集则返回false
        System.out.println("方法1------------------");
        System.out.println(Collections.disjoint(list1, list2));
        System.out.println(Collections.disjoint(list1, list3));
        // 方法2 使用CollectionUtils.containsAny,有交集返回true,没有返回false
        System.out.println("方法2------------------");
        System.out.println(CollectionUtils.containsAny(list1, list2));
        System.out.println(CollectionUtils.containsAny(list1, list3));
        // 方法3 使用CollectionUtil.containsAny,有交集返回true,没有则返回false
        System.out.println("方法3------------------");
        System.out.println(CollectionUtil.containsAny(list1, list2));
        System.out.println(CollectionUtil.containsAny(list1, list3));
        // 方法4 使用java8的新特性
        System.out.println("方法4------------------");
        List<String> coll1 = list1.stream().filter(item -> list2.contains(item)).collect(Collectors.toList());
        if (CollUtil.isNotEmpty(coll1)) {
            System.out.println("有交集");
        } else {
            System.out.println("没有交集");
        }
        List<String> coll2 = list1.stream().filter(item -> list3.contains(item)).collect(Collectors.toList());
        if (CollUtil.isNotEmpty(coll2)) {
            System.out.println("有交集");
        } else {
            System.out.println("没有交集");
        }
        List<String> coll3 = list1.stream().filter(list2::contains).collect(Collectors.toList());
        if (CollUtil.isNotEmpty(coll3)) {
            System.out.println("有交集");
        } else {
            System.out.println("没有交集");
        }
        List<String> coll4 = list1.stream().filter(list3::contains).collect(Collectors.toList());
        if (CollUtil.isNotEmpty(coll4)) {
            System.out.println("有交集");
        } else {
            System.out.println("没有交集");
        }

执行结果:

方法1------------------
false
true
方法2------------------
true
false
方法3------------------
true
false
方法4------------------
有交集
没有交集
有交集
没有交集

说明:

①全限定名为java.util.Collections,在俩个集合没有交集的时候会返回true,否则返回false。

②全限定名为:org.apache.commons.collections.CollectionUtils,两个集合有交集会返回true,否则会返回false,跟Collections.disjoint相反。

③全限定名为:cn.hutool.core.collection.CollectionUtil,两个集合有交集会返回true,否则会返回false,跟Collections.disjoint相反。

④使用Java8的新特性

5.获取两个集合的交集

示例:

        List<String> list1 = new ArrayList<>(Arrays.asList("1", "2", "3", "4", "5", "6", "7"));
        List<String> list2 = new ArrayList<>(Arrays.asList("1", "2", "33", "44", "55", "6", "7"));
        List<String> list3 = new ArrayList<>(Arrays.asList("11", "22", "33", "44", "55", "66", "77"));
        // 方式1
        List<String> result1 = new ArrayList<>();
        for (String data : list1) {
            if (list2.contains(data) && !result1.contains(data)) {
                result1.add(data);
            }
        }
        System.out.println("集合1和集合2的交集:" + result1);
        List<String> result2 = new ArrayList<>();
        for (String data : list1) {
            if (list3.contains(data) && !result1.contains(data)) { // 去重
                result1.add(data);
            }
        }
        System.out.println("集合1和集合3的交集:" + result2);

        // 方式2
        List<String> result3 = new ArrayList<>();
        list1.forEach(item -> {
            if (list2.contains(item) && !result3.contains(item)) {
                result3.add(item);
            }
        });
        System.out.println("集合1和集合2的交集:" + result1);
        List<String> result4 = new ArrayList<>();
        list1.forEach(item -> {
            if (list3.contains(item) && !result3.contains(item)) {
                result3.add(item);
            }
        });
        System.out.println("集合1和集合3的交集:" + result4);
        // 方式3
        List<String> result5 = new ArrayList<>();
        result5 = list1.stream().filter(list2::contains).collect(Collectors.toList());
        System.out.println("集合1和集合2的交集:" + result5);
        List<String> result6 = new ArrayList<>();
        result6 = list1.stream().filter(list3::contains).collect(Collectors.toList());
        System.out.println("集合1和集合3的交集:" + result6);

执行结果:

集合1和集合2的交集:[1, 2, 6, 7]
集合1和集合3的交集:[]
集合1和集合2的交集:[1, 2, 6, 7]
集合1和集合3的交集:[]
集合1和集合2的交集:[1, 2, 6, 7]
集合1和集合3的交集:[]

说明:

①通过循环其中一个集合,判断集合的每个元素是否在另一个集合中存在,如果存在并且在新集合中不存在则将元素添加到新集合中。

②去重也可以使用hashset进行去重。

        List<String> list4 = Arrays.asList("1", "1", "2", "2", "3");
        HashSet<String> set1 = new HashSet<>(list4);
        List<String> list5 = new ArrayList<>(set1);

        System.out.println("去重前:" + list4);
        System.out.println("去重前:" + list5);

参照:Java判断两个集合是否具有交集及如何获得交集详解_java_脚本之家

6.集合转为字符串

示例:

        List<String> list1 = new ArrayList<>(Arrays.asList("1", "2", "3", "4", "5", "6", "7"));
        System.out.println(list1.stream().collect(Collectors.joining(",")));

执行:

1,2,3,4,5,6,7

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值