集合系列(十九) -List与数组互转操作介绍

一、数组转List

方式一

通过 Arrays.asList(strArray) 方式,将数组转换List,但不能对List增删,只能查改,否则抛异常,例子如下:

public static void main(String[] args) {//创建一个字符串数组String[] strArray = new String[]{"a","b","c"};//数组转化成ListList<String> strList = Arrays.asList(strArray);System.out.println("转化后的List:"+strList);//向List中添加内容strList.add("d");System.out.println(strList);
}

输出结果:

转化后的List[a, b, c]
Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(AbstractList.java:148)at java.util.AbstractList.add(AbstractList.java:108)at com.example.container.d.TestList.main(TestList.java:16)

为什么会抛异常呢?

这是因为通过Arrays.asList(strArray),返回的对象是java.util.Arrays.ArrayList,并非是java.util.ArrayList,因为java.util.Arrays.ArrayList并没有add()remove()方法,所以调用add()方法会报错!

方式二

既然java.util.Arrays.ArrayListjava.util.ArrayList不一样,那么就将java.util.Arrays.ArrayList转为java.util.ArrayList,方法如下:

public static void main(String[] args) {//创建一个字符串数组String[] strArray = new String[]{"a","b","c"};//通过构造方法,将数组转化成ListList<String> strList = new ArrayList<String>(Arrays.asList(strArray));System.out.println("转化后的List:"+strList);//向List中添加内容strList.add("d");System.out.println(strList);
}

输出结果:

转化后的List[a, b, c]
[a, b, c, d]

此时就没啥问题了。

方式三(推荐使用)

除了方式二以外,还有一种方法,通过Collections.addAll()进行操作,也如下:

public static void main(String[] args) {//创建一个字符串数组String[] strArray = new String[]{"a","b","c"};//创建一个固定大小的ListList<String> strList = new ArrayList<String>(strArray.length);//通过Collections类将数组转化成ListCollections.addAll(strList,strArray);System.out.println("转化后的List:"+strList);//向List中添加内容strList.add("d");System.out.println(strList);
}

输出结果:

转化后的List[a, b, c]
[a, b, c, d]

打开Collections.addAll底层源码,如下:

public static <T> boolean addAll(Collection<? super T> c, T... elements) {boolean result = false;for (T element : elements)result |= c.add(element);return result;
}

其实就是遍历数组,然后添加到集合中,最高效的一种方法,推荐使用!

方式四(推荐使用)

使用Stream中的Collector收集器来转化,需要jdk1.8支持,内容如下:

public static void main(String[] args) {//创建一个字符串数组String[] strArray = new String[]{"a","b","c"};//转换后的List 属于 java.util.ArrayList 能进行正常的增删查操作List<String> strList = Stream.of(strArray).collect(Collectors.toList());System.out.println("转化后的List:"+strList);//向List中添加内容strList.add("d");System.out.println(strList);
}

输出结果:

转化后的List[a, b, c]
[a, b, c, d]

这种方式,也比较推荐,前提是jdk需要升级到1.8!

二、List转数组

方式一

使用list.toArray不带参数的方法,转化后的返回值类型为Object,如果强转会抛异常!

public static void main(String[] args) {//创建一个ListList<String> strList = new ArrayList<String>();strList.add("a");strList.add("b");strList.add("c");//将List转换成数组Object[] objArray = strList.toArray();System.out.println("objArray:" + JSONArray.toJSON(objArray));//将List强制转换成StringString[] strArray = (String[])strList.toArray();System.out.println("strArray:" + JSONArray.toJSON(strArray));
}

输出结果:

objArray:["a","b","c"]
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;at com.example.container.d.Test2List.main(Test2List.java:24)

使用ArrayList.toArray不带参数的方法,默认返回的是Object类型,如果强制转换会抛java.lang.ClassCastException异常!

ArrayList.toArray(),源码如下:

public Object[] toArray() {return Arrays.copyOf(elementData, size);
}
方式二(推荐使用)

使用list.toArray带参数进行转换,内容如下:

public static void main(String[] args) {//创建一个ListList<String> strList = new ArrayList<String>();strList.add("a");strList.add("b");strList.add("c");//将List转换成String,指定返回数组类型并指定大小String[] strArray = strList.toArray(new String[strList.size()]);System.out.println("strArray:" + JSONArray.toJSON(strArray));
}

输出结果:

strArray:["a","b","c"]

ArrayList.toArray()的带参方法,在创建数组的时候指定数组的长度,最好与集合size保持一致,jdk 源码如下:

public <T> T[] toArray(T[] a) {if (a.length < size)// Make a new array of a's runtime type, but my contents:return (T[]) Arrays.copyOf(elementData, size, a.getClass());System.arraycopy(elementData, 0, a, 0, size);if (a.length > size)a[size] = null;return a;
}

三、写到最后

最近无意间获得一份阿里大佬写的技术笔记,内容涵盖 Spring、Spring Boot/Cloud、Dubbo、JVM、集合、多线程、JPA、MyBatis、MySQL 等技术知识。需要的小伙伴可以点击如下链接获取,资源地址:技术资料笔记。

不会有人刷到这里还想白嫖吧?点赞对我真的非常重要!在线求赞。加个关注我会非常感激!

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

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

相关文章

EFcore 6 连接oracle19 WinForm vs2022

用EFcore访问Oracle&#xff0c;终于不需要Oracle的什么安装包了&#xff0c;直接在VS2022中就可以轻松搞定。在csdn上看到一哥们的帖子&#xff0c;测试了一下&#xff0c;发现很方便。使用的场景是&#xff1a;VS2022中EFcore6。经过测试&#xff0c;同 Navicat Premium 16比…

ES6 全详解 let 、 const 、解构赋值、剩余运算符、函数默认参数、扩展运算符、箭头函数、新增方法,promise、Set、class等等

目录 ES6概念ECMAScript6简介ECMAScript 和 JavaScript 的关系ES6 与 ECMAScript 2015 的关系 1、let 、 const 、var 区别2、变量解构赋值1、数组解构赋值2、对象解构赋值3、字符串的解构赋值 3、展开剩余运算符1、**展开运算符(...)**2、**剩余运算符(...)** 4、函数的拓展函…

Windows终端添加git bash

环境&#xff1a;windows11 终端&#xff1a;windows terminal git bash默认的界面不太好看&#xff0c;添加到终端会比较好用 步骤 打开 windows terminal&#xff0c;在向下箭头 点击 设置左侧栏 点击 “添加新配置文件”&#xff0c;如下图配置&#xff0c;主要修改项&…

牛客2024【牛客赛文X】春招冲刺ONT61 每日温度【hard 单调栈 Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/1f54e163e6944cc7b8759cc09e9c78d8 思路 单调栈最直接的应用就是获取数组中每个位置i,i的左边第一个比i大或者小的位置/数以及,i的右边第一个比i大或者小的位置/数不懂的同学看这里https://blog.csdn.net/Borsl…

docker完美安装分布式任务调度平台XXL-JOB

分布式任务调度平台XXL-JOB 1、官方文档 自己看 https://www.xuxueli.com/xxl-job/#1.1%20%E6%A6%82%E8%BF%B0 2、使用docker部署 本人使用的腾讯云&#xff0c;安装docker暴露一下端口&#xff0c;就很舒服的安装这个服务了。 docker pull xuxueli/xxl-job-admin:2.4.03…

使用Docker部署Node.js

第一步&#xff1a;在Node.js项目的根目录中新建Dockerfile文件 # 使用官方 Node.js 镜像作为基础镜像 FROM node:latest# 设置工作目录 WORKDIR /usr/src/app# 将项目文件复制到容器中 COPY . .# 将npm源设置为淘宝镜像 RUN npm config set registry https://registry.npmmir…

大数据深度学习:基于Tensorflow深度学习的神经网络CNN算法垃圾分类识别系统

文章目录 大数据深度学习&#xff1a;基于Tensorflow深度学习的神经网络CNN算法垃圾分类识别系统一、项目概述二、深度学习卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;三、部分数据库架构四、系统实现系统模型部分核心代码模型训练…

React + three.js 3D模型面部表情控制

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制 示例项目(github)&#xff1a;https://github.com/couchette/simple-react-three-facial-expression-demo 示例项目(gitcode)&#xff…

嵌入式操作教程_数字信号处理_音频编解码:3-6 AAC音频解码实验

一、实验目的 了解AAC音频格式&#xff0c;掌握AAC音频解码的原理&#xff0c;并实现将AAC格式的音频解码为PCM 二、实验原理 音频编解码的主要对象是音乐和语音&#xff0c;音频的编解码格式可分为无压缩的格式、无损压缩格式、有损音乐压缩格式、有损语音压缩格式和合成算…

Testng测试框架(6)--@Factory动态地创建测试类的实例

工厂允许您动态地创建测试。例如&#xff0c;假设您想创建一个测试方法&#xff0c;该方法将多次访问网站上的某个页面&#xff0c;并且您希望使用不同的值来调用它。 public class TestWebServer {Test(parameters { "number-of-times" })public void accessPage(…

突破界限 千视将在 NAB 2024 展会上展示领先的 AV over IP 技术

突破界限&#xff01;千视将在 NAB 2024 展会上展示领先的 AV over IP技术 作为AV over IP领域的先驱者&#xff0c;Kiloview将于2024年4月14日至17日在NAB展会&#xff08;展台号&#xff1a;SU6029&#xff09;隆重登场&#xff0c;展示我们领先业界的AV over IP产品、解决方…

jenkins 启动linux节点时 控制台中文显示问号乱码

新增一个jenkins节点时&#xff0c;遇到了控制台中文输出问号的问题。 网上各种配置jenkins的全局变量&#xff0c;都不行。 最终是 节点列表 ->对应节点 -> 启动方式 -> 高级 添加JVM选项 -Dfile.encodingUTF-8