java数组转换为List注意地方详解编程语言
我们经常需要使用到Arrays这个工具的asList()方法将其转换成列表。方便是方便,但是有时候会出现莫名其妙的问题。如下:
public static void main(String[] args) {
int[] datas = new int[]{1,2,3,4,5};
List list = Arrays.asList(datas);
System.out.println(list.size());
}
Output:
1
结果是1,是的你没有看错, 结果就是1。但是为什么会是1而不是5呢?先看asList()的源码
public static T List T asList(T a) {
return new ArrayList T
}
注意这个参数:T…a,这个参数是一个泛型的变长参数,我们知道基本数据类型是不可能泛型化的,也是就说8个基本数据类型是不可作为泛型参数的,但是为什么编译器没有报错呢?这是因为在java中,数组会当做一个对象来处理,它是可以泛型的,所以我们的程序是把一个int型的数组作为了T的类型,所以在转换之后List中就只会存在一个类型为int数组的元素了。所以我们这样的程序System.out.println(datas.equals(list.get(0)));输出结果肯定是true。当然如果将int改为Integer,则长度就会变成5了。
我们在看下面程序:
enum Week{Sum,Mon,Tue,Web,Thu,Fri,Sat}
public static void main(String[] args) {
Week[] weeks = {Week.Sum,Week.Mon,Week.Tue,Week.Web,Week.Thu,Week.Fri};
List Week list = Arrays.asList(weeks);
list.add(Week.Sat);
}
这个程序非常简单,就是讲一个数组转换成list,然后改变集合中值,但是运行呢?
Exception in thread main java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:131)
at java.util.AbstractList.add(AbstractList.java:91)
at com.array.Test.main(Test.java:18)
编译没错,但是运行竟然出现了异常错误!UnsupportedOperationException ,当不支持请求的操作时,就会抛出该异常。从某种程度上来说就是不支持add方法,我们知道这是不可能的!什么原因引起这个异常呢?先看asList()的源代码:
public static T List T asList(T a) {
return new ArrayList T
}
这里是直接返回一个ArrayList对象返回,但是注意这个ArrayList并不是java.util.ArrayList,而是Arrays工具类的一个内之类:
private static class ArrayList E extends AbstractList E
implements RandomAccess, java.io.Serializable{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}
/** 省略方法 **/
}
但是这个内部类并没有提供add()方法,那么查看父类:
public boolean add(E e) {
add(size(), e);
return true;
}
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
这里父类仅仅只是提供了方法,方法的具体实现却没有,所以具体的实现需要子类自己来提供,但是非常遗憾
这个内部类ArrayList并没有提高add的实现方法。在ArrayList中,它主要提供了如下几个方法:
1、size:元素数量
2、toArray:转换为数组,实现了数组的浅拷贝。
3、get:获得指定元素。
4、contains:是否包含某元素。
所以综上所述,asList返回的是一个长度不可变的列表。数组是多长,转换成的列表是多长,我们是无法通过add、remove来增加或者减少其长度的。
转载请注明来源网站:blog.ytso.com谢谢!
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/14867.html
cjavamac相关文章
- JSON数组转Java List
- 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )[通俗
- Contest1620 – 2020-2021-2学期《Java Web 系统开发》:java基础:字符串
- think in java一_Think in Java(一):Java基础「建议收藏」
- java pfx 证书_Java将pfx证书转换为jks[通俗易懂]
- java启动器_JAVA基础:Java 启动器如何查找类
- java控制台输入数组_Java控制台输入数组并逆序输出的方法实例
- java 阶乘算法_Java 实现阶乘算法
- java集合中:set与list相互转换[通俗易懂]
- Java转换流_java中的字符使用什么编码
- 未检查的转换: 'java.lang.Object' 转换为'java.util.List<Course>' 的解决方法
- java list 转json 字符串_JSON的String字符串与Java的List列表对象的相互转换
- java字符串转换为json对象6_Json对象与Json字符串的转化、JSON字符串与Java对象的转换…
- Java生成随机数组_java生成唯一数字
- Java list foreach_java的foreach
- intellij怎么创建Java_intellij idea创建java项目
- Java 8 使用 Stream 把 List 转换为 map
- Java 把 Map 的值(Value)转换为 Array, List 或 Set
- Java学习笔记之三java中的变量和常量详解编程语言
- java处理json的工具类(list,map和json的之间的转换)详解编程语言
- Java封装MySQL让编程更简单(java封装mysql)
- 数据库写入Java实现MySQL数据库的写入操作(java向mysql)
- Java高效操作MySQL数据库(java写入mysql)
- 策略解析Redis的Java过期策略(redisjava过期)
- 数据库Java查询Oracle数据库:一种快捷、可靠的解决方案(java查询oracle)
- 运行Linux中定时运行Java程序的实用方法(linux定时java)
- Linux下快速安装Java开发环境(linux安装java)
- 使用Redis优化Java开发的关键技巧(redis与java开发)
- 在Linux上实现Java程序的运行(linux运行java程序)
- Java模拟Oracle实现稳定数据库性能(java模仿oracle)
- JAVA中list,set,数组之间的转换详解