Java中List与数组互相转换
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与数组互相转换的更多相关文章
- java 中集合和数组互相转换
package test; import java.util.Arrays;import java.util.List; /** * Created by Administrator on 2016/ ...
- java中List与数组的转换
1.数组转换成List public static <T> List<T> asList(T... a) String[] arr = new String[] {" ...
- Java中数据类型及其之间的转换
Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...
- 在Java中怎样把数组转换为ArrayList?
翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在S ...
- Java中数据类型及其之间的转换(转)
Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种:1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits).2 ...
- 关于==和equals()方法&Java中string与char如何转换&String,StringBuffer
1.对于基本数据类型,可以直接使用==和!=进行内容比较 如:int x=30; int y=30; x==y; //true 基本数据类型 简单类型(基本类型) bo ...
- Java中创建泛型数组
Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...
- JAVA中list,set,数组之间的转换详解
JAVA的list,set,数组之间的转换,主要是使用Apache Jakarta Commons Collections,具体的方法如下:import org.apache.commons.coll ...
- Java中List转换为数组,数组转List
今天写代码遇到一个奇怪的问题,具体代码不贴出了,写一个简化的版本.如下: ArrayList<String> list=new ArrayList<String>(); ...
随机推荐
- OpenStack之六: plancement服务(端口8778)
官网地址:https://docs.openstack.org/placement/stein/install/install-rdo.html #:创建placement库,并授权 MariaDB ...
- 【编程思想】【设计模式】【创建模式creational】lazy_evaluation
Python版 https://github.com/faif/python-patterns/blob/master/creational/lazy_evaluation.py #!/usr/bin ...
- my43_mysql内存相关概念
相关参数 read_buffer_size https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_re ...
- 【Java 基础】 instanceof和isInstance区别详解
obj instanceof class 也就是说这个对象是不是这种类型, 1.一个对象是本身类的一个对象 2.一个对象是本身类父类(父类的父类)和接口(接口的接口)的一个对象 3.所有对象都是Obj ...
- 关于ssh-keygen 生成的key以“BEGIN OPENSSH PRIVATE KEY”开头
现在使用命令 ssh-keygen -t rsa 生成ssh,默认是以新的格式生成,id_rsa的第一行变成了"BEGIN OPENSSH PRIVATE KEY" 而不在是&q ...
- Windows10常用快捷键+cmd常见命令码
Windows10常用快捷键+cmd常见命令码 1.Ctrl快捷键 Ctrl+C: 复制 Ctrl+V: 粘贴 Ctrl+A: 全选内容 Ctrl+S: 保存 Ctrl+X: 剪切 Ctrl+Z: 撤 ...
- numpy基础教程--clip函数的使用
在numpy中,clip函数的原型为clip(self, min=None, max=None, out=None),意思是把小于min的数全部置换为min,大于max的数全部置换为max,在[min ...
- 转:Java多线程基础问题
如果你即将去一家从事大型系统研发的公司进行Java面试,不可避免的会有多线程相关的问题.下面是一些针对初学者或者新手的问题,如果你已经具备良好的基础,那么你可以跳过本文,直接尝试针对进阶水平的Java ...
- 【超详细】安全测试===sqlmap使用心得(零)
零.前言 这篇文章是学习Sqlmap的用法时做的笔记,记录了Sqlmap的常见.基础用法. 一.Sqlmap是什么 Sqlmap是开源的自动化SQL注入工具,由Python写成,具有如下特点: 完全支 ...
- 使用Redis+自定义注解实现接口防刷
最近开发了一个功能,需要发送短信验证码鉴权,考虑到短信服务需要收费,因此对此接口做了防刷处理,实现方式主要是Redis+自定义注解(需要导入Redis的相关依赖,完成Redis的相关配置,gs代码,这 ...