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.hqwc.cn/news/705211.html

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

相关文章

【考研数学】进入强化,基础过关《660》不会做怎么办?

做题没思路&#xff0c;说明学习的过程中走了弯路 很多人&#xff0c;按部就班的学习&#xff0c;觉得课我也听了&#xff0c;讲义也看了&#xff0c;怎么别人做题很顺&#xff0c;自己翻开书就一头雾水。搞清楚其中的差别&#xff0c;也就解决了做题没思路的问题。 首先我们…

波搜索算法(WSA)-2024年SCI新算法-公式原理详解与性能测评 Matlab代码免费获取

​ 声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、初始化阶段 二、全…

【35分钟掌握金融风控策略28】贷中模型体系策略应用

目录 贷中模型体系策略应用 信用模型体系和模型在策略中的应用 反欺诈模型体系和模型在策略中的应用 运营模型体系和模型在策略中的应用 贷中模型体系策略应用 在贷前模型部分已经讲过&#xff0c;贷前开发的很多模型是可以在贷中直接使用的。贷中与贷前的不同点在于&…

webhook 和 API:你了解吗

Webhooks 是许多 API 的补充。通过设置 webhook 系统&#xff0c;系统 B 可以注册接收有关系统 A 某些更改的通知。当更改发生时&#xff0c;系统 A 推送 更改到系统 B&#xff0c;通常是以发出 HTTP POST 请求的形式。 Webhooks 旨在消除或减少不断轮询数据的需要。但根据我的…

软考一年只能考一次吗?24软考各科目考试时间一览表

软考考试次数&#xff1a; 软考高级【系统分析师】及【系统架构设计师】是一年考两次的。 此外&#xff0c;软考中级【软件设计师】和【网络工程师】也是一年考两次的。 其他科目一年都只开考一次&#xff0c;或者上半年开考&#xff0c;或者下半年开考&#xff0c;具体考试…

k8s 二进制安装 优化架构之 部署负载均衡,加入master02

目录 一 实验环境 二 部署 CoreDNS 1&#xff0c;所有node加载coredns.tar 镜像 2&#xff0c;在 master01 节点部署 CoreDNS 3&#xff0c; DNS 解析测试 4&#xff0c; 报错分析 5&#xff0c;重新 DNS 解析测试 三 master02 节点部署 1&#xff0…

DeepSpeed

文章目录 一、关于 DeepSpeed1、DeepSpeed 是什么2、深度学习训练和推理的极致速度和规模3、DeepSpeed 的四大创新支柱1&#xff09;DeepSpeed 训练2&#xff09;DeepSpeed 推理3&#xff09;DeepSpeed 压缩4&#xff09;DeepSpeed4Science 4、DeepSpeed 软件套件DeepSpeed 库推…

Golang RPC实现-day02

导航 Golang RPC实现一、客户端异步并发多个请求1、 客户端结构体2、 一个客户端&#xff0c;异步发送多个请求&#xff0c;使用call结构体代表客户端的每次请求3、客户端并发多个请求4、客户端接收请求 Golang RPC实现 day01 我们实现了简单的服务端和客户端。我们简单总结一…

景源畅信电商:做抖音有哪些未开发的蓝海领域?

在互联网信息爆炸的今天&#xff0c;抖音已经成为人们获取信息和娱乐的重要渠道。然而&#xff0c;随着用户数量的增加和内容的丰富&#xff0c;抖音的红海竞争也日益激烈。在这样的背景下&#xff0c;寻找还未被充分开发的蓝海领域&#xff0c;对于内容创作者来说&#xff0c;…

思科模拟器--2.静态路由和默认路由配置24.5.15

首先&#xff0c;创建三个路由器和两个个人电脑。 接着&#xff0c;配置两台电脑的IP&#xff0c;子网掩码和默认网关 对Router 0&#xff0c;进行以下命令&#xff1a; 对Router进行以下命令&#xff1a; 对Router2进行以下命令&#xff1a; 本实验完成。 验证&#xff1a;PC…

MT3036 第一节离数课后

思路&#xff1a; 这道题与之前的表达式求值题目不同的是&#xff0c;有not这个单目运算符。而且如果表达式错误&#xff0c;要输入error。 把true和false成为操作数&#xff0c;把and or not成为运算符。 考虑error的情况&#xff1a; 1.and 和 or是双目运算符&#xff0c…

线性模型之岭回归的用法

实战&#xff1a;使用岭回归模型 完整代码&#xff1a; import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split fro…

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

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

实战+代码!Selenium + Phantom JS爬取天天基金数据

功能&#xff1a; 通过程序实现从基金列表页&#xff0c;获取指定页数内所有基金的近一周收益率以及每支基金的详情页链接。再进入每支基金的详情页获取其余的基金信息&#xff0c;将所有获取到的基金详细信息按近6月收益率倒序排列写入一个Excel表格。 思路&#xff1a; 1.…

fastadmin对登录token的处理

fastadmin对token的操作 最近开发遇到一个场景&#xff0c;需要绕过验证获取登录&#xff0c;所以恶补了一下这个知识点&#xff0c;这个主要就是控制fastadmin的token的问题 代码分步实现 class Xcxuser extends Api {//关于鉴权protected $noNeedLogin [login,getopenid,…

错误: 找不到或无法加载主类问题(已解决)

今天在虚拟机中安装了idea2023.2的版本&#xff0c;运行代码时发现错误找不到主类&#xff01; 直接说结论&#xff1a; 我先clean了一下target&#xff0c;然后重新build&#xff0c;发现maven报错了&#xff0c;idea2023.2默认使用了内置的maven&#xff0c;然后我切换了一下…

Yalmip使用教程(8)-常见报错及调试方法

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 这篇博客将详细介绍使用yalmip工具箱编程过程中的常见错误和相应的解决办法。 1.optimize的输出参数 众所周知&#xff0c;optimize是yalmip用来求…

中国农业大学:学硕11408复试线上涨40分,今年还会持续涨吗?中国农业大学计算机考研考情分析!

中国农业大学&#xff08;China Agricultural University&#xff09;&#xff0c;简称“中国农大”&#xff0c;坐落于中国首都北京&#xff0c;由中华人民共和国教育部直属&#xff0c;中央直管副部级建制&#xff0c;水利部、农业部和北京市共建&#xff0c;位列国家“双一流…

解决kali Linux2024无法获取动态IPv4地址(DHCP)解决方案

用root用户启动终端 进入根目录&#xff0c;选择配置文件 cd到根目录下/../etc/network找到interfaces文件 编辑interfaces文件 vi interfaces&#xff0c;编辑interfaces文件 输入如下命令 打开虚拟网络编辑器 选择虚拟机选项卡&#xff0c;编辑&#xff0c;打开虚拟网络编…

Jmeter(四十一) - 从入门到精通进阶篇 - Jmeter配置文件的刨根问底 - 下篇(详解教程)

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 为什么宏哥要对Jmeter的配置文件进行一下讲解了&#xff0c;因为有的童鞋或者小伙伴在测试中遇到一些需要修改配置文件的问题不是很清楚也不是很懂&#xff0c;就算修改了也是…