提高你的Java代码质量吧:避免基本类型数组转换列表陷阱(Arrays.asList())
2013-08-20 09:07
197 查看
一、分析
我们在开发的过程中经常会使用Arrays和Collections这两个工具类在数组和列表之间转换。
Arrays.asList()方法:输入一个变长参数,返回一个固定长度的列表。看源码:
asList方法输入的是一个泛型变长参数,我们知道基本类型是不能泛型化的,也就是说8个基本类型不能作为泛型参数,要想作为泛型化参数就必须使用其对应的包装类型。
二、场景
在使用Arrays虽然非常方便,但有时候会出现一些奇怪的问题,看如下代码:
也许你会说,这很简单,list变量的元素数量当然是5。但是运行结果却是1。
由上分析得知,int基本类型是不能被泛型化,传入asList方法的。在Java中数组是一个对象,它是可以泛型化的,也就是说上面例子把int类型的数组作为了T的类型,所以在转换后在List中就只有一个类型为int数组的元素了。我们打印出来看看,代码如下:
输出结果是:
元素类型:class [I
前后是否相等:true
问题弄清楚了,修改方案也就有了,直接使用包装类型即可,代码如下:
三、建议
原始类型数组不能作为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的输入参数,否则会引起程序逻辑混乱。
相关文章推荐
- [改善Java代码]避开基本类型数组转换列表陷阱
- [编写高质量代码:改善java程序的151个建议]建议65 避开基本类型数组转换列表陷阱
- Java_集合操作_避开基本类型数组转换列表陷阱
- java8一句代码搞定基本类型数组转List
- 避开基本类型数组转换列表陷阱
- 避开基本类型数组转换列表陷阱
- 基本类的数组利用Arrays.asList方法转换成list
- 提高你的Java代码质量吧:三元操作符的类型陷阱
- Arrays.asList打印基本数据类型数组出错
- Arrays.asList 转换数组后add或remove出现java.lang.UnsupportedOperationException异常
- 提高你的Java代码质量吧:不要让类型默默转换
- java避开基本数据类型转换列表陷阱
- 提高你的Java代码质量吧:不要让类型默默转换
- JSON-JSON字符串转换成JSON对象、JSON对象数组、java实体类以及保存到List列表中
- Java基础小知识——基本数据类型和字符串以及字节数组的转换
- java类型list、set、数组、map之间的转换
- java中utf-8编码的byte数组转换成String类型代码
- java中utf-8编码的byte数组转换成String类型代码
- Java中的移位操作以及基本数据类型转换成字节数组【收集】