提高你的Java代码质量吧:避免基本类型数组转换列表陷阱(Arrays.asList())

一、分析 

我们在开发的过程中经常会使用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的输入参数,否则会引起程序逻辑混乱


新技术,新未来!欢迎大家关注 “1024工场”微信服务号 ,时刻关注我们的最新的技术讯息! (甭客气!尽情的扫描或者长按!)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值