集合和数组的相关操作

news2024/11/16 0:52:17

目录

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1507256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fastgithub

上Github太慢、打不开怎么办&#xff1f; 选择之一是Fastgithub工具&#xff0c;同时支持win, linux, mac。 1. 工作原理 从公共dns服务器拿到github的大量ip数据&#xff0c;检测哪些ip可用&#xff0c;哪些ip访问速度最佳&#xff0c;然后编写一个本地版的dns服务&#xff0…

小巧设备,大能量:探索口袋中的远程控制神器

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…

【EtherCAT实践篇】十、SSC工具使用说明

EtherCAT Slave Stack Code&#xff08;SSC&#xff09;是倍福提供的EtherCAT从站源代码生成工具&#xff0c;基于SSC工具&#xff0c;可以大大降低EtherCAT数据通讯程序及xml设计难度。 本操作参考SSC软件包中的EtherCAT Slave Design Quick Guide.pdf文档。 1、创建一个SSC工…

项目解决方案:视频监控接入和录像系统设计方案(下)

目 录 1.概述 2. 建设目标及需求 2.1建设总目标 2.2 需求描述 ​2.3 需求分析 3.设计依据与设计原则 3.1设计依据 3.2 设计原则 4.建设方案设计 4.1系统方案设计 4.2组网说明 5.产品介绍 5.1视频监控综合资源管理平台介绍 5.2视频录像服务器和存储 5.2.…

后勤管理系统|基于SSM 框架+vue+ Mysql+Java+B/S架构技术的后勤管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

目录 文末获取源码 前台首页功能 员工注册、员工登录 个人中心 公寓信息 员工功能模块 员工积分管理 管理员登录 ​编辑管理员功能模块 个人信息 ​编辑员工管理 公寓户型管理 ​编辑公寓信息管理 系统结构设计 数据库设计 luwen参考 概述 源码获取 文末获取源…

bug总结(1)--变量取错

a c t i v i t y [ ′ t a g n a m e ′ ] 应为 activity[tag_name]应为 activity[′tagn​ame′]应为couponActivitList[0][‘name’] .隐藏的bug&#xff0c;在测试中竟然测不出来&#xff0c;而且上线了好久。为啥会出现这种低级错误呢&#xff1f;第一是写的时候不够仔细认…

C语言:基于单链表实现的泊车管理系统

一、需求 &#xff08;1&#xff09;管理员方账号登录&#xff1b; &#xff08;2&#xff09;车位管理显示&#xff1a;车位状态&#xff1b; &#xff08;3&#xff09;收费管理&#xff1a;小轿车 5元/小时&#xff0c;面包车6元/小时&#xff0c;大货车或客车7元/小时&a…

算法(6种思想、7种查找)、与数据结构(数组/链表/栈与队列/树)整理总结

算法 除了这里提到的算法思想和查找算法&#xff0c;算法还有别的类型&#xff1a; 排序算法&#xff1a; 对一组元素进行排序的算法。常见的排序算法包括冒泡排序、快速排序、归并排序等。 图算法&#xff1a; 解决图结构相关问题的算法&#xff0c;例如最短路径问题、最小…

Zookeeper详解

1.Zookeeper概述 1.Zookeeper概念 Zookeeper是 Apache Hadoop 项目下的一个子项目&#xff0c;是一个树形目录服务 Zookeeper 翻译过来就是动物园管理员&#xff0c;他是用来管 Hadoop&#xff08;大象&#xff09;、Hive(蜜蜂)、Pig(小猪)的管理员。简称zk Hadoop: 存储海…

【周总结周末日常】

周总结 完成任务开发并且与前端联调通过 完成已开发功能的冒烟测试 修复测试中出现的一些数据显示问题 2024/3/10 晴 温度适宜 这周天气比上周好多了&#xff0c;最起码见到好几次太阳 周六在世纪公园溜达一会儿&#xff0c;偶尔呼吸下大自然&#xff0c;挺棒的…

力扣hot100:152.乘积最大子数组(动态规划)

一个子数组问题&#xff0c;我们要使用线性dp&#xff0c;最好先考虑以i结尾&#xff0c;如果定义dp[i]为前i个数最大子数组乘积值 那么dp[i-1]就无法转移到dp[i]。因此我们先考虑dp[i]定义为以第i个数结尾的最大子数组乘积值。 53. 最大子数组和 最大子数组和是一个动态规划问…

重要通告 | 公司更名为“浙江实在智能科技有限公司”

更名公告 升级蜕变、砥砺前行 因业务快速发展和战略升级&#xff0c;经相关政府机构批准&#xff0c;自2024年3月1日起&#xff0c;原“杭州实在智能科技有限公司”正式更名为“浙江实在智能科技有限公司”。 更名后&#xff0c;公司统一社会信用代码不变&#xff0c;业务主体…

蓝桥杯单片机---第十二届省赛题目解析

文章目录 比赛题目一、代码相关定义、声明1.头文件声明2.变量声明 二、主要函数1.main函数2.按键扫描3.数码管显示4.电压模式1、2输出 & LED显示5.定时器中断6.消除85C显示 三、次要函数1.初始化函数Init2.按键函数Key3.LED函数Led4.数码管函数Seg5.iic函数中6.onewire函数…

python(5)之处理数组

上次代码结果如下&#xff1a; 1、处理数组的缺失值 1、isnan&#xff08;&#xff09;函数 isnan&#xff08;&#xff09;函数是Numpy模块里的一个可以标记数组中缺失值的位置 代码示例如下&#xff1a; import numpy as np ac np.array([1,2,3,2,3,4,5,9,np.nan,1]) p…

分布式CAP原理详解

引言 随着互联网的飞速发展&#xff0c;越来越多的应用开始采用分布式系统来提高系统的可用性和扩展性。在分布式系统中&#xff0c;CAP原理是一个非常重要的理论&#xff0c;它描述了分布式系统在面临网络分区时&#xff0c;如何在一致性、可用性和分区容错性之间进行权衡。本…

PDF24 Creator PDF工具箱 v11.17.0

软件介绍 可将大部分文件转成pdf格式的免费软件&#xff0c;安装好后会在你的打印机里看到一个叫PDF24的虚拟打印机&#xff0c;你可将要转成pdf格式的文件打印时选虚拟打印机PDF24&#xff0c;也可以直接将文件以拖拉方式拉进这软件的主视窗编辑区里&#xff0c;它会自动转成…

信息系统项目管理师006:车联网(1信息化发展—1.2现代化基础设施—1.2.3车联网)

文章目录 1.2.3 车联网1.体系框架2.链接方式3.场景应用 记忆要点总结 1.2.3 车联网 车联网是新一代网络通信技术与汽车、电子、道路交通运输等领域深度融合的新兴产业形态。智能网联汽车是搭载先进的车载传感器、控制器、执行器等装置&#xff0c;并融合现代通信与网络技术&…

模型驱动架构MDA

MDE 模型驱动工程&#xff08;MDE, Model-Driven Engineering&#xff09;是软件工程的一个分支&#xff0c;它将模型与建模拓展到软件开发的所有方面&#xff0c;形成一个多维建模空间&#xff0c;从而将工程活动建立在这些模型的映射和转换之上。[1] MDE的基本原则是将模型视…

【leetcode热题】对链表进行插入排序

给定单个链表的头 head &#xff0c;使用 插入排序 对链表进行排序&#xff0c;并返回 排序后链表的头 。 插入排序 算法的步骤: 插入排序是迭代的&#xff0c;每次只移动一个元素&#xff0c;直到所有元素可以形成一个有序的输出列表。每次迭代中&#xff0c;插入排序只从输…

代码训练LeetCode(7)删除有序数组中的重复项

代码训练(7)LeetCode之删除有序数组中的重复项 Author: Once Day Date: 2024年3月10日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09;力扣…