集合和数组的相关操作

目录

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,有交集则返回falseSystem.out.println("方法1------------------");System.out.println(Collections.disjoint(list1, list2));System.out.println(Collections.disjoint(list1, list3));// 方法2 使用CollectionUtils.containsAny,有交集返回true,没有返回falseSystem.out.println("方法2------------------");System.out.println(CollectionUtils.containsAny(list1, list2));System.out.println(CollectionUtils.containsAny(list1, list3));// 方法3 使用CollectionUtil.containsAny,有交集返回true,没有则返回falseSystem.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"));// 方式1List<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);// 方式2List<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);// 方式3List<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.mzph.cn/news/735204.shtml

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

相关文章

代码随想录刷题笔记 DAY 42 | 最后一块石头的重量 II No.1049 | 目标和 No.494 | 一和零 No.474

文章目录 Day 4301. 最后一块石头的重量 II&#xff08;No. 1049&#xff09;<1> 题目<2> 笔记<3> 代码 02. 目标和&#xff08;No. 494&#xff09;<1> 题目<2> 笔记<3> 代码 03. 一和零&#xff08;No. 474&#xff09;<1> 题目&l…

[C/C++]string类常用接口介绍及模拟实现string类

一&#xff1a;Cstring类的由来 在C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用…

字节跳动的 SDXL-LIGHTNING : 体验飞一般的文生图

TikTok 的母公司字节跳动推出了最新的文本到图像生成人工智能模型&#xff0c;名为SDXL-Lightning。顾名思义&#xff0c;这个新模型只需很轻量的推理步骤&#xff08;1&#xff0c;4 或 8 步&#xff09;即可实现极其快速且高质量的文本到图像生成功能。与原始 SDXL 模型相比&…

uniapp开发小程序实现-获取手机号码(二)

一共3篇文章,共同描述,看序号进行寻找。 真机效果图 1.前提 获取手机号码,一定要企业账号,不是企业账号会出现下面提示 所以没有企业账号的,就可以不用看了,申请企业账号去官网申请就行了,申请成功了后,我们接着看。 2.代码 代码参考文章 获取手机号 | 微信开放文…

AI PC:重塑未来办公与生活方式的革命性工具

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面。而在PC领域&#xff0c;一场由AI引领的变革也正在悄然发生。从硬件到软件&#xff0c;从云端到终端&#xff0c;AI正在重塑我们的办公和生活方式。 AI工具网 | 人工智能工具推…

简单银行管理系统(C# winform SQL Server)

一、任务描述 1.使用Asp.NET技术&#xff0c;完成银行管理系统 2.开发工具&#xff1a;VS2010 3.数据库&#xff1a;SQL Server 2008 功能模块&#xff1a;登录、开户、存款、取款、转账、挂失等功能 运行界面&#xff1a; 1.登录界面&#xff08;Login.aspx&#xff09; 在…

数据分析-Pandas两种分组箱线图比较

数据分析-Pandas两种分组箱线图比较 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&am…

牛客周赛 Round 36

赛况 C题可惜&#xff0c;比赛时模拟没有想明白&#xff0c;只对了一半&#xff0c;赛后看了大佬们的题解后恍然大悟&#xff0c;而F题是压根没思路&#xff0c;况且F题部分分也比较难拿。 题目列表 A-小红的数位删除 思路 将读入的数字整除10做三次后输出即可 参考代码 #inc…

高效管理百万级数据:MySQL备份与恢复实战指南

简介 在当今数字化时代&#xff0c;数据是企业不可或缺的核心资产之一&#xff0c;而MySQL作为一种流行的关系型数据库管理系统&#xff0c;其百万级数据的高效管理显得尤为重要。本实战指南将深入探讨MySQL备份与恢复的关键策略&#xff0c;为您提供全面而实用的解决方案。通…

streamlit学习-如何修改css样式

streamlit学习-如何修改css样式 效果图代码(srv.py)运行 streamlit默认的样式有时并不符合自己的要求。比如手机上的布局太浪费空间,我们希望一屏能放下所有的元素,本文演示了如何操作 效果图 代码(srv.py) import streamlit as st #1.31.1 import cv2 import numpy as np im…

实验二(二)OSPF路由协议基础实验

1.实验介绍 1.1关于本实验 开放式最短路径优先 OSPF(Open Shortest Path First)是IETF 组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol)。目前针对 IPv4 协议使用的是 OSPF Version 2(RFC2328);OSPF 作为基于链路状态的协议&#xff0c;OSPF 具有以下优…

OpenFeign的常规使用

架构: 一.新建module 引入依赖: <!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> yml配置; server:port: 80spring:applicati…

计算机网络(五)

网络层 网络层的主要目的是实现网络互连&#xff0c;进而实现数据包在各网络之间的传输。 要实现网络层&#xff0c;主要解决三个问题&#xff1a; ①网络层向运输层提供怎样的服务&#xff1f;&#xff08;“可靠传输“、”不可靠传输“&#xff09; ②网络层寻址 ③路由选择…

2024年k8s最新版本安装教程

k8s安装教程 1 k8s介绍2 环境搭建2.1 主机准备2.2 主机初始化2.2.1 安装wget2.2.2 更换yum源2.2.3 常用软件安装2.2.4 关闭防火墙2.2.5 关闭selinux2.2.6 关闭 swap2.2.7 同步时间2.2.8 修改Linux内核参数2.2.9 配置ipvs功能 2.3 容器安装2.3.1 设置软件yum源2.3.2 安装docker软…

动态规划(蓝桥杯 C++ 题目 代码 注解)

目录 介绍&#xff1a; 题目一&#xff08;数字三角形&#xff09;&#xff1a; 题目二&#xff08;跳跃&#xff09;&#xff1a; 题目三&#xff08;背包问题类型&#xff09;&#xff1a; 题目四&#xff08;蓝肽子序列&#xff09;&#xff1a; 题目五&#xff08;合唱…

学习笔记。。。

1.字符串的拼接 1.sprintf() 往字符串的前面或中间、后面拼接一个字符串。 2.strncpy()用来复制字符串的前n个字符 //dest为目标数组&#xff0c;src为源数组&#xff0c;n为要复制的字符个数 2.char* My_strncpy(char* dest, const char* src, int n) 3.char *strcat(ch…

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

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

【病毒查杀】“PE启动盘+360杀毒软件”对硬盘病毒查杀

通过本步骤&#xff0c;用户可使用WinPE版本360系统急救箱软件对主板硬盘进行病毒木马扫描和杀毒操作。 360系统急救箱&#xff0c;这款软件是360官方推出的一款杀毒工具箱&#xff0c;可以帮助用户仅在WinPE环境下就可对硬盘进行病毒木马查杀&#xff0c;可能查杀过后因病毒木…

网络安全: Kali Linux 进行 MSFvenom 程序利用

目录 一、实验 1.环境 2. Kali Linux 进行 MSFvenom 程序利用 3. 创建计划任务自动运行 MSFvenom 程序 二、问题 1.在线加密解密 2.MSF 运行失败 3.MobaXterm 连接Ubuntu 失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统版本IP备注Kali Linux20…

STM32单片机基本原理与应用(十一)

语音识别实验 此实验采用STM32核心板 LD3320模块&#xff0c;通过初始化LD3320并写入待识别关键词&#xff0c;对麦克风说出相应关键词&#xff0c;实现实训平台上的流水灯相应变化的效果。 LD3320 是一颗基于非特定人语音识别 &#xff08;SI-ASR&#xff1a;Speaker-Indepen…