Java中的数组、Set、List、Map类型的互相转换总结

序言

数组、Set、List、Map是Java语言非常常用的几种数据类型,他们之间存在着千丝万缕的联系。关于底层的数据结构我这里就不再多说啦,直接从应用出发,总结他们之间的转换方法,并给出推荐方法。

大家可以点赞收藏等到需要的时候随时回顾查看使用!!!

如果将他们每两个类型的转换方式都总结一遍的,一共四种类型,再加上来回转换,每个转换都假设只讲一个方法,就要总结32次,因此这次不一一全部总结,采用递进方式,关系最接近的两个类型之间逐一转换讲解:

数组↔List(ArrayList)↔Set(HashSet)↔Map(HashMap)

1.数组与List(ArrayList)的转换

1.1数组——>List(ArrayList)

定义数组为

int[] array = {2,0,0,1,5,2,6,7};
1.常规遍历
/*** 整数数组通过循环遍历的方式,将元素逐一插入List中* @param array*/public static List<Integer> arrayToListFor(int[] array){List<Integer> list = new ArrayList<>();for (int i = 0; i < array.length; i++) {list.add(array[i]);}// 输出list内容System.out.println(list);// 输出list的类型System.out.println(list.getClass());return list;}

输出结果:

[2, 0, 0, 1, 5, 2, 6, 7]
class java.util.ArrayList	
2.jdk1.8的新特性stream流转换(推荐)

如果是int基本数据类型则要多进行一步装箱,Integer类型则不需要,直接toList()即可。

/***利用java8的stream流将数组转换为List*/public static void arrayToListStream(){int[] array = {2,0,0,1,5,2,6,7};Integer[] array1 = {5,2,6,7,2,0,0,1};// 基本数据类型利用stream流转成List,需要先对int数据类型调用boxed()方法进行装箱再转换List<Integer> intList = Arrays.stream(array).boxed().collect(Collectors.toList());List<Integer> integerList = Arrays.stream(array1).collect(Collectors.toList());// 输出intList内容System.out.println(intList);// 输出integerList内容System.out.println(integerList);// 输出intList的类型System.out.println(intList.getClass());// 输出integerList的类型System.out.println(integerList.getClass());}

上述代码输出结果:

[2, 0, 0, 1, 5, 2, 6, 7]
[5, 2, 6, 7, 2, 0, 0, 1]
class java.util.ArrayList
class java.util.ArrayList

4.直接使用Arrays.asList(数组)方法
5.使用List.of(数组)
6.利用ArrayList<>()构造方法结合前两种方法的其中一种

public static void listToArray(){// 利用Arrays.asList()方法将数组转换为ListInteger[] array = {2,0,0,1,5,2,6,7};List<Integer> list1 = Arrays.asList(array);System.out.println(list1);System.out.println(list1.getClass());// 利用List.of()方法将数组转换为ListList<Integer> list2 = List.of(array);System.out.println(list2);System.out.println(list2.getClass());// 利用ArrayList的构造方法将数组转换为ListList<Integer> list3 = new ArrayList<>(List.of(array));System.out.println(list3);System.out.println(list3.getClass());}
[2, 0, 0, 1, 5, 2, 6, 7]
class java.util.Arrays$ArrayList
[2, 0, 0, 1, 5, 2, 6, 7]
class java.util.ImmutableCollections$ListN
[2, 0, 0, 1, 5, 2, 6, 7]
class java.util.ArrayList

从结果可以看出,虽然最终都转成了List,但是却是不同的List类型。java.util.Arrays\$ArrayListjava.util.ImmutableCollections\$ListNjava.util.ArrayList 是 Java 中三种不同的列表实现类,它们有一些区别。

java.util.Arrays$ArrayList 是 Arrays 类的静态内部类,它是 Arrays 类使用asList方法返回的 List 实现,这个列表是固定大小的,不能进行添加或删除元素的操作。

java.util.ImmutableCollections$ListN 是 Java 9 引入的不可变 List 实现,它是不可变的、固定大小的列表,因此也不能进行元素的添加或删除操作。

java.util.ArrayList 是 Java 中最常用的动态数组实现,它是一个可变大小的数组,可以根据需要动态增长或缩小,并且支持多种操作。

1.2List——>数组

简单的循环遍历加入到数组中这里就不再重新写一遍了。

1.使用stream流转换推荐

使用流(Stream)和方法引用(Method Reference)将 List 转换为 int 数组

public static void listToArray(){List<Integer> list = new ArrayList<>(List.of(5,2,6,7,2,0,0,1));// 使用流(Stream)和方法引用(Method Reference)将 List<Integer> 转换为 int 数组int[] intArray = list.stream().mapToInt(Integer::intValue).toArray();// 输出转换后的 int 数组for (int value : intArray) {System.out.print(value+",");}System.out.println();System.out.println(intArray.getClass());}

结果如下:

5,2,6,7,2,0,0,1,
class [I

2. List(ArrayList)与Set的转换

List是元素有序且可重复的列表,Set是元素无序且不可重复的集合,他们之间可以互相转换。

2.1List(ArrayList)——>Set集合

1.for循环一个一个加入到set中,这里就不再演示
2.HashSet构造器传入List推荐
/**
*HashSet构造器传入List
*/
public static void listToSetStream(){List<Integer> list = new ArrayList<>(List.of(5,2,6,7,2,0,0,1));Set<Integer> set = new HashSet<>(list);// 输出set内容System.out.println(set);// 输出set的类型System.out.println(set.getClass());}

结果如下:可以看到类型为我们想要的HashSet,元素也进行了去重且和List顺序不一致。

[0, 1, 2, 5, 6, 7]
class java.util.HashSet
3.使用stream流
    public static void listToSetStream(){List<Integer> list = new ArrayList<>(List.of(5,2,6,7,2,0,0,1));Set<Integer> set = list.stream().collect(Collectors.toSet());// 输出转换后的Set内容System.out.println(set);// 输出转换后的Set的类型System.out.println(set.getClass());}

结果和第二种方法一样。并且根据IDEA提示,其推荐将该方法直接替换成第二种构造器的方法。因此第二种更推荐。
在这里插入图片描述

2.1Set——>List(ArrayList)

1.List构造器方法推荐

public static void setToList(){Set<Integer> set = new HashSet<>(Set.of(5,2,6,7,0,1));List<Integer> list = new ArrayList<>(set);// 输出转换后的List内容System.out.println(list);// 输出转换后的List的类型System.out.println(list.getClass());}

输出结果:

[0, 1, 2, 5, 6, 7]
class java.util.ArrayList
2.stream流
public static void setToListStream(){Set<Integer> set = new HashSet<>(Set.of(5,2,6,7,0,1));List<Integer> list = set.stream().collect(Collectors.toList());System.out.println(list);System.out.println(list.getClass());}

同样,IDEA也给出提示,推荐使用ArrayList构造器方法。
在这里插入图片描述

2. Set与Map的转换

2.1 Set——>Map

由于Map是键值对,Set是单个元素值,所以转换时需要指定键和值,这里我指定set的值为Map的键,字符串value+值作为Map的值。

1.stream流推荐
public static void setToMap(){Set<Integer> set = new HashSet<>(List.of(1,2,3,4,5));Map<Integer, String> map = set.stream().collect(Collectors.toMap(i -> i, i -> "value"+i));System.out.println(map);System.out.println(map.getClass());}

结果如下:

{1=value1, 2=value2, 3=value3, 4=value4, 5=value5}
class java.util.HashMap
2.循环put,这里不再赘述

Map——>Set

因为Map是键值对,因此转换成Set有两种情况,

1.将Map的全部键转为Set
public static void mapToSet(){Map<Integer,String> map = new HashMap<>();map.put(1,"value1");map.put(2,"value2");map.put(3,"value3");map.put(4,"value4");Set<Integer> keys = map.keySet();System.out.println(keys);System.out.println(keys.getClass());}

结果如下:

[1, 2, 3, 4]
class java.util.HashMap$KeySet

可以看到转换得到的类型并不是最纯正的HashSet。HashMap$KeySet这个类是 HashMap 的一个视图(View),它表示该 HashMap 中的键集合。它并不是一个独立的类,而是与 HashMap 实例相关联的。当你从 HashMap 中获取键集时(例如通过 map.keySet()),你得到的是一个视图,该视图反映了 HashMap 中当前的键。如果 HashMap 中的键发生变化(添加、删除或修改),那么通过 keySet() 获取的视图也会相应地更新。例如如下:
在这里插入图片描述

2.如果要转成不与HashMap关联的Set,则用新的HashSet的构造器接住该KeySet推荐

如下:
在这里插入图片描述

2.将Map的全部值转为Set

1.stream流,利用map.values().stream()
public static void mapGetValues(){Map<Integer,String> map = new HashMap<>();map.put(1,"value1");map.put(2,"value2");map.put(3,"value3");map.put(4,"value4");Set<String> values = map.values().stream().collect(Collectors.toSet());System.out.println(values);System.out.println(values.getClass());map.put(6,"value6");System.out.println(values);}

结果如下:

[value2, value1, value4, value3]
class java.util.HashSet
[value2, value1, value4, value3]
2.同样使用HashSet的构造器接住map.values()的返回值
public static void mapGetValues(){Map<Integer,String> map = new HashMap<>();map.put(1,"value1");map.put(2,"value2");map.put(3,"value3");map.put(4,"value4");// 构造器接住。Set<String> values = new HashSet<>(map.values());System.out.println(values);System.out.println(values.getClass());map.put(6,"value6");System.out.println(values);}

总结

综上,已经总结了常用的几个集合类型之间的转换方法,大家可以根据自己的需求选择,像常见的构造器转换方法和stream流方法都比较推荐。大家可以多多实践,便可深刻掌握。

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

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

相关文章

四、基于Stage模型的应用架构设计

前面我们了解了如何构建鸿蒙应用以及开发了第一个页面&#xff0c;这只是简单的demo&#xff1b;那么如何去设计&#xff0c;从0到1搭建一个真正的应用呢 一、基本概念 1、Stage模型基本概念 Stage模型概念图 AbilityStage&#xff1a;是一个Module级别的组件容器&#xff0…

C语言/数据结构——栈的实现

一.前言 今天我们讲解新的领域——栈。 二.正文 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其允许在固定的一段进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#…

LLama3大模型本地部署 仅需6步完成对话模型本地安装部署。附送可视化ui安装、自定义模型目录,修改模型保存地址,第三方微调模型、中文模型下载地址

本篇分为三部分 一&#xff1a;6步完成llama3大模型本地部署 二&#xff1a;8步完成llama3可视化对话界面安装 三&#xff1a;重设模型文件路径 四&#xff1a;微调模型、中文模型下载资源分享 一、LLama3 大模型本地部署安装 首先去mata官网下载ollama客户端 Ollama 选择合适…

通俗易懂讲乐观锁与悲观锁

浅谈乐观锁与悲观锁 乐观锁和悲观锁是Java并发编程中的两个概念。使用乐观锁和悲观锁可以解决并发编程中数据不一致性、死锁、性能差等问题&#xff0c;乐观锁与悲观锁的实行方式不同&#xff0c;所以其特性也不近相同&#xff0c;下文将详细介绍两者的特性与适用场景。 《熊…

OFDM 802.11a的FPGA实现(十六)长训练序列:LTS(含Matlab和verilog代码)

目录 1.前言2.原理3.Matlab生成长训练序列4.硬件实现5.ModelSim仿真6.和Matlab仿真结果对比 原文链接&#xff08;相关文章合集&#xff09;&#xff1a; OFDM 802.11a的xilinx FPGA实现 1.前言 在之前已经完成了data域数据的处理&#xff0c;在构建整个802.11a OFDM数据帧的时…

【Redis】Redis面试和工作中十有八九会遇到的问题

1. 数据类型 常用的Redis数据类型有5种&#xff0c;分别是&#xff1a; String、List、Set、SortedSet、Hash 还有一些高级数据类型&#xff0c;比如Bitmap、HyperLogLog、GEO等&#xff0c;其底层都是基于上述5种基本数据类型。因此在Redis的源码中&#xff0c;其实只有5种数…

React: memo

React.memo 允许你的组件在 props 没有改变的情况下跳过重新渲染。 const MemoizedComponent memo(SomeComponent, arePropsEqual?)React 通常在其父组件重新渲染时重新渲染一个组件。你可以使用 memo 创建一个组件&#xff0c;当它的父组件重新渲染时&#xff0c;只要它的新…

Docker Compose常用命令与属性

大家好&#xff0c;今天给大家分享Docker Compose的常用命令&#xff0c;以及docker-compose文件的属性。Docker Compose 是一个用于定义和运行多容器 Docker 应用应用的重要工具。它通过一个配置文件&#xff08;docker-compose.yml&#xff09;来详细定义多个容器之间的关联、…

软考中级-软件设计师 (十一)标准化和软件知识产权基础知识

一、标准化基础知识 1.1标准的分类 根据适用的范围分类&#xff1a; 国际标准指国际化标准组织&#xff08;ISO&#xff09;、国际电工委员会&#xff08;IEC&#xff09;所制定的标准&#xff0c;以及ISO所收录的其他国际组织制定的标准。 国家标准&#xff1a;中华人民共和…

Redis20种使用场景

Redis20种使用场景 1缓存2抽奖3Set实现点赞/收藏功能4排行榜5PV统计&#xff08;incr自增计数&#xff09;6UV统计&#xff08;HeyperLogLog&#xff09;7去重&#xff08;BloomFiler&#xff09;8用户签到&#xff08;BitMap&#xff09;9GEO搜附近10简单限流11全局ID12简单分…

在大型项目上,Python 是个烂语言吗?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Python的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; python项目超过5万行&#x…

前端之电力系统SVG图低代码

其实所有的图形都是由点&#xff0c;线&#xff0c;面组成的。点线面可以组成一个设备。下面就简单讲讲点线面是怎么画的吧 对于线&#xff0c;可以用path <g><path:d"M ${beginX},${beginY} L ${endX},${endY}":stroke-width"lineWidth":strok…

【Pip】pip 安装第三方包异常:[SSL:CERTIFICATE_VERIFY_FAILED]解决方案

pip 安装第三方包异常:[SSL:CERTIFICATE_VERIFY_FAILED] 大家好 我是寸铁&#x1f44a; 总结了一篇pip 安装第三方包异常:[SSL:CERTIFICATE_VERIFY_FAILED]✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 报错 今天在安装第三方包时报错如下: 解决方案 本质上是需要指定信任的镜像…

C#【进阶】泛型

1、泛型 文章目录 1、泛型1、泛型是什么2、泛型分类3、泛型类和接口4、泛型方法5、泛型的作用思考 泛型方法判断类型 2、泛型约束1、什么是泛型2、各泛型约束3、约束的组合使用4、多个泛型有约束思考1 泛型实现单例模式思考2 ArrayList泛型实现增删查改 1、泛型是什么 泛型实现…

pytest教程-46-钩子函数-pytest_sessionstart

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_report_testitemFinished钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_sessionstart钩子函数的使用方法。 pytest_sessionstart 是 Pytest 提供的一个钩子函数&#xff0c…

python使用opencv实现手势识别并控制ppt

需要使用到的包 from collections import dequeimport cv2 import numpy as np import math import shutilimport sys import os import time#这个求出现频率最高的太慢了&#xff0c;所以把它放弃了 from collections import Counter准备好安装包后需要获取图片 def star():…

DockerFile介绍与使用

一、DockerFile介绍 大家好&#xff0c;今天给大家分享一下关于 DockerFile 的介绍与使用&#xff0c;DockerFile 是一个用于定义如何构建 Docker 镜像的文本文件&#xff0c;具体来说&#xff0c;具有以下重要作用&#xff1a; 标准化构建&#xff1a;提供了一种统一、可重复…

SQL注入漏洞常用绕过方法

SQL注入漏洞 漏洞描述 Web 程序代码中对于用户提交的参数未做过滤就直接放到 SQL 语句中执行&#xff0c;导致参数中的特殊字符打破了原有的SQL 语句逻辑&#xff0c;黑客可以利用该漏洞执行任意 SQL 语句&#xff0c;如查询数据、下载数据、写入webshell 、执行系统命令以及…

企业OA办公系统开发笔记:1、搭建后端环境

文章目录 企业办公系统&#xff1a;搭建环境一、项目介绍1、介绍2、技术栈3、项目模块4、数据库 二、搭建环境1、搭建后端1.1、搭建父工程clfwzx-oa-parent1.2、搭建工具类父模块common1.3、搭建工具类common的子模块1.4、搭建实体类模块model和项目模块service-oa 2、配置依赖…

【前端】CSS基础(3)

文章目录 前言1. CSS常用元素属性1.1 字体属性1.1.1 字体1.1.2 字体大小1.1.3 字体颜色1.1.4 字体粗细1.1.5 文字样式 前言 这篇博客仅仅是对CSS的基本结构进行了一些说明&#xff0c;关于CSS的更多讲解以及HTML、Javascript部分的讲解可以关注一下下面的专栏&#xff0c;会持续…