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()方法将数组转换为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流方法都比较推荐。大家可以多多实践,便可深刻掌握。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

传说中的运维门户设计

在IT服务管理这片广阔天地中&#xff0c;运维门户如同一位技艺高超的魔术师&#xff0c;轻轻一挥手&#xff0c;便将纷繁复杂的运维世界化繁为简&#xff0c;编织成一张便捷高效、触手可及的网络。它不仅是ITSM系统中不可或缺的一环&#xff0c;更是连接用户与技术世界的桥梁&a…

【打字】打字训练之针对性键盘区域练习

本文章的核心点是&#xff1a;使用代码生成自己想要训练的键位的词汇&#xff0c;然后导入到打字软件针对性练习 一个程序员突然想纠正打字习惯源于腱鞘炎&#xff0c;虽然使用双拼打字已经不慢了&#xff0c;但是姿势不是很正确&#xff0c;导致了腱鞘炎。 所以想着好好纠正指…

就这?轻轻松松在RK356X Android11适配ML307R Cat.1模组

开源鸿蒙硬件方案领跑者 触觉智能 Industio 本文基于IDO-SXB3568主板&#xff0c;介绍Android11平台上适配中移物联ML307R Cat.1 4G模组的方法。该方法适用于触觉所有RK356X的主板。 IDO-SXB3568是触觉智能推出的RK3568行业主板&#xff0c;预计6月上旬正式上架售卖。该行业主…

Docker安装Mosquitto

在物联网项目中&#xff0c;我们经常用到MQTT协议&#xff0c;用MQTT协议做交互就需要部署一个MQTT服务&#xff0c;而mosquitto是一个常用的MQTT应用服务&#xff0c; Mosquitto是一个实现了消息推送协议MQTT v3.1的开源消息代理软件。MQTT&#xff08;Message Queuing Teleme…

【淘宝超高价女装】电商最好项目:一单赚1000多

课程目录 01.【超高价女装】项目介绍实操案例 02.【超高价女装】找款&#xff1a;配得上1000多的款式 03.【超高价女装】软件上款&#xff1a;600个款为底 04.【超高价女装】标题&#xff1a;能卖1000多的标题 05.【超高价女装】销量布局&#xff1a;主推款做销量评价 06…

【python量化交易】—— Alpha选股策略 - Qteasy自定义交易策略【附源码】

使用qteasy创建并回测Alpha选股交易策略 使用qteasy创建并回测Alpha选股交易策略策略思想第一种自定义策略设置方法&#xff0c;使用持仓数据和选股数据直接生成比例交易信号PS信号&#xff1a;第二种自定义策略设置方法&#xff0c;使用PT交易信号设置持仓目标&#xff1a;第三…

代码审计--变量覆盖

漏洞原理 变量覆盖(Dynamic Variable Evaluation) 是指变量未被初始化&#xff0c; 而我们自定义的变量可以替换程序原有的变量值。 相关函数 $$ &#xff0c; extract &#xff0c; parse_str &#xff0c; import_request_variables 等等 这里涉及到一个安全函数&#xf…

嬴政只比刘邦大三岁,项羽竟是比刘邦小24岁的小老弟?

大秦始皇帝祖龙嬴政、汉太祖高皇帝刘邦、西楚霸王项羽他们的出生顺序怎样&#xff1f; 细看正史我们就知道&#xff0c;项羽嬴政刘邦这三个人&#xff0c;说他们是兄弟可以&#xff0c;说他们有代差也不错&#xff1a;公元前259年&#xff0c;秦始皇降生&#xff0c;三年后的…

Blender 导入资源包的例子

先到清华源下载资源包&#xff1a; Index of /blender/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/blender/demo/asset-bundles/human-base-meshes/human-base-meshes-bundle-v1.1.0.zip 解压/hum…

【数据结构】C++语言实现二叉树的介绍及堆的实现(详细解读)

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

【Leetcode每日一题】 动态规划 - 简单多状态 dp 问题 - 删除并获得点数(难度⭐⭐)(76)

1. 题目解析 题目链接&#xff1a;LCR 091. 粉刷房子 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 1. 状态定义 在解决这类问题时&#xff0c;我们首先需要根据题目的具体要求来定义状态。针对房屋粉刷问题&#…

malloc_consolidate

此文章用于详细介绍malloc_consolidate。 众所周知&#xff0c;fastbin一般是不能合并&#xff0c;但在malloc_consolidate中是个例外。 1.触发机制 首先构造这样的堆块结构 一个0x40的堆块在fastbin中&#xff0c;一个0x110的堆块在unbin中 随后我们尝试分配一个0x300的堆…

智能BI(后端)-- 系统异步化

文章目录 系统问题分析什么是异步化&#xff1f;业务流程分析标准异步化的业务流程系统业务流程 线程池为什么需要线程池&#xff1f;线程池两种实现方式线程池的参数线程池的开发 项目异步化改造 系统问题分析 问题场景&#xff1a;调用的服务能力有限&#xff0c;或者接口的…

strcpy函数详解

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

共享文件夹(以及问题解决方法)

目录 文件夹共享 第一步&#xff0c;将文件夹共享 第二步&#xff0c;设置用户权限 第三步&#xff0c;打开网络发现 第四步&#xff0c;访问 网络中没有设备问题 控制面板&#xff0c;启动 重启 还是不行&#xff1f;计算机管理&#xff0c;启动 FDResPub服务&#x…

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

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

JumpServer堡垒机应用(v3.10.8) 下

目录 JumpServer堡垒机简单式部署与管理(v3.10.8) 上-CSDN博客 一. 资产管理 1.1创建资产 1.2 给资产主机创建用户 1.2.1 普通账户&#xff1a; 1.2.2 特权账户&#xff1a; 1.2.3 创建用户 二. 命令过滤 2.1 创建命令组 2.2 创建命令过滤 ​编辑 三. 创建资产授权 …

大模型算法(一):从Transformer到ViT再到LLaMA

单任务/单领域模型 深度学习最早的研究集中在针对单个领域或者单个任务设计相应的模型。 对于CV计算机视觉领域&#xff0c;最常用的模型是CNN卷积模型。其中针对计算机视觉中的不同具体任务例如分类任务&#xff0c;目标检测任务&#xff0c;图像分割任务&#xff0c;以CNN作…

Linux的常用指令 和 基础知识穿插巩固(巩固知识必看)

目录 前言 ls ls 扩展知识 ls -l ls -a ls -al cd cd 目录名 cd .. cd ~ cd - pwd 扩展知识 路径 / cp [选项] “源文件名” “目标文件名” mv [选项] “源文件名” “目标文件名” rm 作用 用法 ./"可执行程序名" mkdir rmdir touch m…

Springboot+Vue项目-基于Java+MySQL的制造装备物联及生产管理ERP系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…