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>(); ...
随机推荐
- Android,iOS系统有什么区别
两者运行机制不同:IOS采用的是沙盒运行机制,安卓采用的是虚拟机运行机制.Android是一种基于Linux的自由及开源的操作系统,iOS是由苹果公司开发的移动操作系统IOS中用于UI指令权限最高,安 ...
- spring-cloud-alibaba-dependencies版本问题
org.springframework.cloud的spring-cloud-alibaba-dependencies管理的nacos最新版本是0.9.0.RELEASE,已经不再维护了,用起来有版本 ...
- 【Spring Framework】12种spring中定义bean的方法
前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...
- javascript将平行的拥有上下级关系的数据转换成树形结构
转换函数 var Littlehow = {}; /** * littlehow 2019-05-15 * 平行数据树形转换器 * @type {{format: tree.format, sort: ...
- 全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(二)资源的获取和释放
上期的<全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(一)AQS基础>中介绍了什么是AQS,以及AQS的基本结构.有了这些概念做铺垫之后,我们就可以正 ...
- Jsp/Servlet文件的上传和下载
文件上传的入门 文件上传的步骤: 总结实现思路: 1.创建核心上传类ServletFileUpload,这个时候需要一个工厂类 2.创建磁盘工厂类对象DiskFileItemFactory ...
- <转>Hadoop入门总结
转自:http://www.cnblogs.com/skyme/archive/2012/06/01/2529855.html 第1章 引言 1.1 编写目的 对关于hadoop的文档及资料进行进一步 ...
- UVA294 约数 Divisors 题解
Content 给定 \(n\) 个区间 \([l,r]\),求出每个区间内约数个数最大的数. 数据范围:\(1\leqslant l<r\leqslant 10^{10}\),\(r-l\le ...
- CF1199B Water Lily 题解
Content 有一朵长在水中的莲花,其茎秆部分露出水面的高度为 \(h\).有人将它往右边拽了 \(l\) 米,使得整个茎秆部分都浸在水中.求池水的深度. 数据范围:\(1\leqslant h&l ...
- 基于GDI和D3D的抓屏技术
GDI32Api.Direct3D屏幕截图 最近因为工作需要,认真研究了一下屏幕截图的方法. 最主要的方法有两种,一.调用windows GDI32 API函数.二.使用DirectX9.0来实现. ...