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

news2024/11/15 11:35:08

序言

数组、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()方法将数组转换为List
        Integer[] 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()方法将数组转换为List
        List<Integer> list2 = List.of(array);
        System.out.println(list2);
        System.out.println(list2.getClass());
         // 利用ArrayList的构造方法将数组转换为List
        List<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.coloradmin.cn/o/1679973.html

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

相关文章

(保姆级教程傻瓜式操作)树莓派--基于opencv实现人脸识别

前言 因为当时没有边实验边记录&#xff0c;所以这篇文章可能存在疏漏。不过很多地方我推荐了我参考过的博客或者视频&#xff0c;希望尽可能地解答您的疑惑&#xff0c;如果您仍有不懂的地方&#xff0c;欢迎评论&#xff0c;如果我知道答案&#xff0c;我会很乐意为您解答。 …

电脑缺失api-ms-win-crt-runtime-l1-1-0.dll文件的几种修复方法

当您在使用电脑过程中遇到程序启动失败&#xff0c;提示缺少“api-ms-win-crt-runtime-l1-1-0.dll”文件时&#xff0c;不必过于焦虑&#xff0c;此问题通常与Windows系统的Visual C Redistributable组件未正确安装或损坏有关。小编将介绍5种修复电脑缺失api-ms-win-crt-runtim…

jiebaNET中文分词器

最近我接手了一个有趣的需求&#xff0c;需要对用户评价进行分词&#xff0c;进行词频统计和情绪分析&#xff0c;并且根据词频权重制成词云图以供后台数据统计&#xff0c;于是我便引入了jieba分词器,但是我发现网上关于jiebaNET相关文档实在太少了&#xff0c;甚至连配置文件…

Maven依赖管理项目构建

Maven依赖管理项目构建工具 目录 文章目录 Maven依赖管理项目构建工具目录一、Maven简介1、为什么学习Maven1.1、Maven是一个依赖管理工具1.2、Maven是一个构建工具1.3、结论 2. Maven介绍3. Maven软件工作原理模型图&#xff08;了解&#xff09; 二、Maven安装和配置1. Mave…

链接表存储图(C++注释详解): 构建表 深度优先遍历 (DFS)

链接表的结构体单元: #define size 100 typedef struct node {int idx;//下一个节点的索引int wt;//权重, 也可根据实际情景存储边的信息struct node* next; }Node; Node* hd[size]; // 存储图的邻接表 链接表的的构建: int main() {int n, m;cin >> n >> m; //…

Win11把应用程序添加到开机自启动中

通过WinR命令打开“运行”&#xff0c;输入shell:startup 进入到如图目录&#xff1a; 将想要自动启动的应用的快捷方式都拷贝进来。 之后在任务管理器中就能发现它了。

ipa 功能包调试,分区算法,覆盖算法测试

参考 wiki 流网络 flow network 解释 相关文章 ipa 分区算法 ipa 分区算法总结&#xff0c;部分算法图解 环境 ubuntu20&#xff0c;ros 版本 noetic 运行测试 按照 readme 提示进行测试&#xff0c;跳过第一个步骤&#xff0c;并不需要 turtlebot3。 执行第三个 launch 报…

Go微服务开源框架kratos的依赖注入关系总结

该文章为学习开源微服务框架kratos的学习笔记&#xff01;官方文档见&#xff1a;简介 | Kratos Kratos 一套轻量级 Go 微服务框架&#xff0c;包含大量微服务相关框架及工具。 一、Kratos 项目结构简介 通过 Kratos 工具生成的 Go工程化项目模板如下&#xff1a; applicati…

界面组件DevExpress Reporting v24.1预览版 - 拥有原生Angular报表查看器

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 下一个主要更新(v24.1)将于6月初发布&#xff…

基于java的超级玛丽游戏的设计与实现(论文 + 源码)

Java的超级玛丽游戏.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89313347 基于java的超级玛丽游戏的设计与实现 摘要 近年来&#xff0c;Java作为一种新的编程语言&#xff0c;以其简单性、可移植性和平台无关性等优点&#xff0c;得到了广泛地应用。J2SE称…

基于网络爬虫技术的网络新闻分析(二)

目录 2 系统需求分析 2.1 系统需求概述 2.2 系统需求分析 2.2.1 系统功能要求 2.2.2 系统IPO图 2.2 系统非功能性需求分析 3 系统概要设计 3.1 设计约束 3.1.1 需求约束 3.1.2 设计策略 3.1.3 技术实现 3.3 模块结构 3.3.1 模块结构图 3.3.2 系统层次图 3.3.3…

strcpy函数详解

strcpy函数详解 1.函数简介2.strcpy函数的使用2.1使用方法一2.1使用方法二 3.strcpy在使用过程中的注意事项3.1被复制字符必须以\0结尾3.2目标空间必须能够大于源字符串长度3.3目标空间必须可变 1.函数简介 strcpy函数包含在<string.h>库函数中&#xff0c;是将一个字符…

计算机Java项目|springboot母婴商城系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、Python项目、前端项目、人工智能与大数据、简…

GAME101-Lecture07学习

前言 今天主要讲shading&#xff08;着色&#xff09;。在讲着色前&#xff0c;要先讲图形中三角形出现遮挡问题的方法&#xff08;深度缓存或缓冲&#xff09;。 先采样再模糊错误&#xff1a;对信号的频谱进行翻译&#xff08;在这期间会有频谱的混叠&#xff09;&#xff…

Lora训练Windows[笔记]

一. 使用kohya_ss的GUI版本&#xff08;https://github.com/bmaltais/kohya_ss.git&#xff09; 这个版本跟stable-diffusion-webui的界面很像&#xff0c;只不过是训练模型专用而已&#xff0c;打开的端口同样是7860。 1.双击setup.bat,选择1安装好xformers,pytorch等和cuda…

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

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

Python数据分析与数据可视化 概念

考试题型&#xff1a; 一、填空题&#xff08;1分*10&#xff09; 二、程序代码填空&#xff08;1分*20&#xff09; 三、读程序写结果&#xff08;10分*4&#xff09; 四、程序设计&#xff08;10分*1&#xff09; 五、问答题&#xff08;20分*1&#xff09; 考试范围&#x…

【Pytorch】10.CIFAR10模型搭建

CIFAR10模型 是torchvision中官方给出的一个数据集,可以通过 dataset torchvision.datasets.CIFAR10(./data, trainFalse, downloadTrue, transformtorchvision.transforms.ToTensor())来下载到指定文件夹 搭建CIFAR10模型 首先我们先去搜一下CIFAR10 model structure 可以看…

51单片机超声波测距_液位检测_温度检测原理图PCB仿真代码

目录 实物图&#xff1a; PCB ​原理图​ 仿真图 ​编辑 程序 资料下载地址&#xff1a;51单片机超声波测距-液位检测-温度检测原理图PCB仿真代码 主控为stc89c52,通过ds18b20进行温度采集&#xff0c;超声波测距&#xff0c;距离不可以超过1m&#xff0c;通过按键可以设…

揭秘未来工厂核心:智慧大屏引领可视化管理新潮流

在数字化浪潮席卷全球的今天&#xff0c;智慧工厂已不再是科幻小说中的概念&#xff0c;而是成为了现代工业发展的新引擎。 智慧工厂可视化大屏&#xff0c;不仅仅是一块显示屏&#xff0c;更是工厂运行的“大脑”。通过这块屏幕&#xff0c;我们可以实时掌握工厂的每一个角落、…