博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
避免基本类型数组转换列表陷阱(Arrays.asList())
阅读量:6826 次
发布时间:2019-06-26

本文共 1125 字,大约阅读时间需要 3 分钟。

hot3.png

一、分析 

我们在开发的过程中经常会使用Arrays和Collections这两个工具类在数组和列表之间转换。 
Arrays.asList()方法:输入一个变长参数,返回一个固定长度的列表。看源码:
 
public static<T> List<T> asList(T... a){   
    return new ArrayList<T>(a);   
}
asList方法输入的是一个泛型变长参数,我们知道基本类型是不能泛型化的,也就是说8个基本类型不能作为泛型参数,要想作为泛型化参数就必须使用其对应的包装类型。 
二、场景 
在使用Arrays虽然非常方便,但有时候会出现一些奇怪的问题,看如下代码: 
public static void main(String[] args){   
    int[] data = {1,2,3,4,5};   
    List list = Arrays.asList(data);   
    System.out.println("列表中的元素数量是:" + list.size());   
也许你会说,这很简单,list变量的元素数量当然是5。但是运行结果却是1。 
由上分析得知,int基本类型是不能被泛型化,传入asList方法的。在Java中数组是一个对象,它是可以泛型化的,也就是说上面例子把int类型的数组作为了T的类型,所以在转换后在List中就只有一个类型为int数组的元素了。我们打印出来看看,代码如下: 
public static void main(String[] args){   
    int[] data = {1,2,3,4,5};   
    List list = Arrays.asList(data);   
    System.out.println("元素类型:" + list.get(0).getClass());   
    System.out.println("前后是否相等:" + data.equals(list.get(0));   
}
输出结果是: 
元素类型:class [I 
前后是否相等:true 
问题弄清楚了,修改方案也就有了,直接使用包装类型即可,代码如下: 
public static void main(String[] args){   
    Integer[] data = {1,2,3,4,5};   
    List list = Arrays.asList(data);   
    System.out.println("列表中的元素数量是:"+ list.size());   
}ᅠ   
三、建议 
原始类型数组不能作为asList的输入参数,否则会引起程序逻辑混乱。

转载于:https://my.oschina.net/aptx4869/blog/155559

你可能感兴趣的文章
Java 复用类
查看>>
[CS] 来电处理流程
查看>>
我的友情链接
查看>>
cin.ignore与cin.getline的体验
查看>>
powershell常用命令
查看>>
我的友情链接
查看>>
linux 查看编码格式、用户及组状态
查看>>
squid FATAL: Received Segment Violation...dying.
查看>>
mem调优
查看>>
内核编译安装学习笔记
查看>>
做好数据备份 对你多重要
查看>>
Maven项目导出工程依赖JAR包
查看>>
tomcat修改时区
查看>>
dojo.declare,dojo.define,dojo.require解释
查看>>
浏览器的重绘与重排
查看>>
Web开发必知的八种隔离级别
查看>>
酷炫的显示主页面
查看>>
org.apache.catalina.startup.Catalina start之过程分析
查看>>
CAA如何进行干涉检查?
查看>>
silverlight vs flash
查看>>