1.说明

在Java中,经常遇到需要List与数组互相转换的场景。

List转换成数组,可以使用List的toArray()或者toArray(T[] a)方法。

数组转换成List,可以使用Arrays.asList()或者Collections.addAll()方法。

如果仅仅为了打印数组,不需要把数组转换成List,

可以使用Arrays.toString()方法。

2.List转换成数组

List转换成数组可以调用toArray方法,

这里有两个重载的方法,

一般使用第2个带泛型参数的方法:

Object[] toArray();
<T> T[] toArray(T[] a);

2.1.无参数toArray方法

Object[] toArray();

这个方法将List直接转为Object[]数组。

Java初学者喜欢用这个方法,

没有参数使用起来很方便,

而且代码编译也没有报错,

错误使用的示例代码如下:

List<String> strList = new ArrayList<>();
strList.add("list-a");
strList.add("list-b");
String[] strArray = (String[]) strList.toArray();

结果一运行,直接报错,

不能将Object[]转化为String[]:

Exception in thread "main" java.lang.ClassCastException:
[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

正确使用代码如下:

List<String> strList = new ArrayList<>();
Object[] strArray = strList.toArray();

得到了一个通常情况下没啥用的Object[]。

2.2.支持泛型的toArray方法

<T> T[] toArray(T[] a);

这个方法接收一个类型为 T 的数组,

注意基本类型是不能作为泛型参数的。

如果是使用int[] 类型数组,

需要把 int[] 换成 Integer[] 。

使用的示例代码如下:

List<String> strList = new ArrayList<>();
strList.add("list-a");
strList.add("list-b");
String[] strArray = strList.toArray(new String[strList.size()]);

2.3.toArray方法入参的数组大小

针对如下代码,

分析一下初始化的String数组的大小size,

和List的大小strList.size()的关系,

对于返回值产生的不同影响:

List<String> strList = new ArrayList<>();
strList.add("list-a");
strList.add("list-b");
String[] strArray1 = new String[size];
String[] strArray2 = strList.toArray(strArray1);

2.3.1.size < strList.size()

现在设置size=0,

小于strList.size()=2,

代码修改部分如下:

String[] strArray1 = new String[0];

返回的strArray2和strArray1不是同一个对象。

2.3.2.size = strList.size()

现在设置size=strList.size(),

代码修改部分如下:

String[] strArray1 = new String[strList.size()];

返回的strArray2和strArray1是同一个对象。

所以下面两块代码是等价的,

得到的strArray都是我们期望的结果:

String[] strArray = strList.toArray(new String[strList.size()]);
String[] strArray = new String[strList.size()];
strList.toArray(strArray);

2.3.3.size > strList.size()

现在设置size=strList.size()+1,

代码修改部分如下:

String[] strArray1 = new String[strList.size()+1];

返回的strArray2和strArray1是同一个对象,

但是数组的最后一个元素是null,

如果数组中的元素多于List中的元素,

列表复制完后紧接着的数组末尾被设置为null,

即strArray1[strList.size()]=null,

这对于调用方确定数组的真实长度很有用,

如果使用strList.size()+2初始化数组,

则数组的倒数第二个元素是null。

3.数组转换成List

可以使用Arrays.asList()或者Collections.addAll()方法,

推荐使用Collections.addAll()方法,

这样得到的返回对象可以往里面添加新的元素。

3.1.使用Arrays.asList()方法

示例代码如下:

String[] strArray = { "array-a", "array-b" };
List<String> strList = Arrays.asList(strArray);

注意该方法的返回值是java.util.Arrays类中一个私有静态内部类java.util.Arrays.ArrayList,

它并非java.util.ArrayList类。

java.util.Arrays.ArrayList类具有set(),get(),contains()等方法,

但是不支持添加add()或删除remove()方法,调用这些方法会报错。

如果直接往返回的list添加一个新元素:

strList.add("array-c");

运行会报错UnsupportedOperationException:

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)

解决方法是新建一个List对象,

并且加入返回的strList,

然后再add新元素:

List<String> strListNew = new ArrayList<>(strList);
strListNew.add("array-c");

3.2.使用Collections.addAll()方法

String[] strArray = { "array-a", "array-b" };
List<String> strList = new ArrayList<>(strArray.length);
Collections.addAll(strList, strArray);
strListNew.add("array-c");

得到的返回对象可以直接添加新的元素。

4.参考文章

深入理解List的toArray()方法和toArray(T[] a)方法
ArrayList的toArray
Java数组转List的三种方式及对比

Java中List与数组互相转换的更多相关文章

  1. java 中集合和数组互相转换

    package test; import java.util.Arrays;import java.util.List; /** * Created by Administrator on 2016/ ...

  2. java中List与数组的转换

    1.数组转换成List public static <T> List<T> asList(T... a) String[] arr = new String[] {" ...

  3. Java中数据类型及其之间的转换

    Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...

  4. 在Java中怎样把数组转换为ArrayList?

    翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在S ...

  5. Java中数据类型及其之间的转换(转)

    Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...

  6. 关于==和equals()方法&Java中string与char如何转换&String,StringBuffer

    1.对于基本数据类型,可以直接使用==和!=进行内容比较 如:int x=30;        int y=30;         x==y;  //true 基本数据类型 简单类型(基本类型) bo ...

  7. Java中创建泛型数组

    Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...

  8. JAVA中list,set,数组之间的转换详解

    JAVA的list,set,数组之间的转换,主要是使用Apache Jakarta Commons Collections,具体的方法如下:import org.apache.commons.coll ...

  9. Java中List转换为数组,数组转List

    今天写代码遇到一个奇怪的问题,具体代码不贴出了,写一个简化的版本.如下: ArrayList<String> list=new ArrayList<String>();     ...

随机推荐

  1. Linux学习 - fdisk分区

    一.fdisk命令分区过程 系统一旦重启,分区将消失 1 添加新硬盘 直接在虚拟机上添加 2 查看新硬盘 fdisk -l 3 分区 fdisk /dev/sdb fdisk进入/dev/sdb硬件设 ...

  2. redis入门到精通系列(五):redis的持久化操作(RDB、AOF)

    (一)持久化的概述 持久化顾名思义就是将存储在内存的数据转存到硬盘中.在生活中使用word等应用的时候,如果突然遇到断电的情况,理论上数据应该是都不见的,因为没有保存的word内容都存放在内存里,断电 ...

  3. Oracle SQL中join方式总结

    在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图.物化视图等联结).SQL JOIN其实是一个逻辑概念,像NEST LOOP JOIN. HASH JOIN等 ...

  4. IDEA 使用rest client测试

    一.进入 rest 控制台 idea 导航栏 ==> Tools ==> HTTP Client ==> Test RESTFUL Web Service 如图: 一般来说,idea ...

  5. 正则表达式入门(js版)

    什么是正则表达式 正则表达式 Regular Expression (构造函数 RegExp) 用于字符串匹配规则 要么匹配字符,要么匹配位置 如何新建正则表达式 字面量 /[ab]/gim cons ...

  6. 【阿菜做实践】利用ganache-cli本地fork以太坊主链分叉

    前言 Fork主网意思是模拟具有与主网相同的状态的网络,但它将作为本地开发网络工作. 这样你就可以与部署的协议进行交互,并在本地测试复杂的交互.不用担心分叉主网作为测试链会占很多内存.这些方法都不会将 ...

  7. Identity Server 4 从入门到落地(十)—— 编写可配置的客户端和Web Api

    前面的部分: Identity Server 4 从入门到落地(一)-- 从IdentityServer4.Admin开始 Identity Server 4 从入门到落地(二)-- 理解授权码模式 ...

  8. 第43篇-JNI引用的管理(2)

    之前我们已经介绍了JNIHandleBlock,但是没有具体介绍JNIHandleBlock中存储的句柄,这一篇我们将详细介绍对这些句柄的操作. JNI句柄分为两种,全局和局部对象引用: (1)大部分 ...

  9. Redis操作命令合集

    目录 一.客户端命令 二.sql命令 一.客户端命令 #读取配置文件启动 redis-server redis.conf #关闭 Redis,Redis服务器将断开与客户端链接,产生持久化文件,平滑关 ...

  10. InnoDB学习(五)之MVCC多版本并发控制

    MVCC多版本并发控制,是一种数据库管理系统并发控制的方法.MVCC多版本并发控制下,数据库中的数据会有多个版本,分别对应不同的事务,从而达到事务之间并发数据的隔离.MVCC最大的优势是读不加锁,读写 ...