把Java数组转换为List时的注意事项
2016-03-06 09:32
295 查看
现在将一个Java数组转换成List。对此,Arrays这个类中提供了一个asList的方法,但是如果没有慎重思考就随便使用可能会产生一些糟糕的后果。比如执行下面的代码:
程序运行的输出结果如下:
结果似乎有点“诡异“:
第一个输出就像我们根据API所预测的那样在我们的控制台输出了“[a,b]”。
第二个输出也一样如预期那样输出了“[1,2]”。
第三个输出就不同了,在我们的控制台打印出了类似这样的结果“[[I@330bedb4]”,这就不再如预期那样了——我们得到一个包含数组中标识每个元素唯一性的地址串的list,而不是包含两个Integer对象的list。
同样,第四个输出类似“[[Ljava.lang.String;@2503dbd3, c]”的结果。
但是发生了什么呢?前两个打印语句与我们预期的结果相同,因为JLS规定了调用一个声明为foo(T…
t)的方法,比如foo(new T[]{A,B})等同于foo(A,B)这样的调用。在Arrays.asList方法中T是参数类型,因此它必须为一个Object 类型,但是int不是,而int[]却是。这就是为什么第三个输出等同于 Arrays.asList(new Object[]{ new int[] {1,2}})。
最后也是非常重要的一点,在第四个输出的声明从一开始就产生了调用问题——我们告诉编译器我们需要一个包含String数组和字符串的list。
System.out.println( Arrays.asList(new String[] { "a", "b" })); System.out.println( Arrays.asList(new Integer[] { 1, 2 })); System.out.println( Arrays.asList(new int[] { 1, 2 })); System.out.println( Arrays.asList(new String[] { "a", "b" }, "c"));
程序运行的输出结果如下:
结果似乎有点“诡异“:
第一个输出就像我们根据API所预测的那样在我们的控制台输出了“[a,b]”。
第二个输出也一样如预期那样输出了“[1,2]”。
第三个输出就不同了,在我们的控制台打印出了类似这样的结果“[[I@330bedb4]”,这就不再如预期那样了——我们得到一个包含数组中标识每个元素唯一性的地址串的list,而不是包含两个Integer对象的list。
同样,第四个输出类似“[[Ljava.lang.String;@2503dbd3, c]”的结果。
但是发生了什么呢?前两个打印语句与我们预期的结果相同,因为JLS规定了调用一个声明为foo(T…
t)的方法,比如foo(new T[]{A,B})等同于foo(A,B)这样的调用。在Arrays.asList方法中T是参数类型,因此它必须为一个Object 类型,但是int不是,而int[]却是。这就是为什么第三个输出等同于 Arrays.asList(new Object[]{ new int[] {1,2}})。
Arrays.asList(new Object[] { new int[] { 1, 2 } })
最后也是非常重要的一点,在第四个输出的声明从一开始就产生了调用问题——我们告诉编译器我们需要一个包含String数组和字符串的list。
相关文章推荐
- 上机题目(初级)- 用数组实现记事本(Java)
- 在web service间传递java bean
- Spring工作流程
- Java小练习
- 2016蓝桥杯假期任务之《买不到的数目》
- 怎么解决eclipse报PermGen space异常的问题
- spring aop报错:Cannot proxy target class because CGLIB2 is not available.
- 【代码笔记】Java基础:Java的方法和类
- 使用Java的Lucene搜索工具对检索结果进行分组和分页
- struts实现MVC
- Java你可能不知道的事系列1
- 在Spring中配置使用commons-logging的simplelog来输出日志
- java 爬虫
- java 爬虫
- 关于JAVA中的Synchronization和interface误用
- Java定义class
- Java SE7新特性之try-with-resources语句
- 20145240《Java程序设计》第一周学习总结
- java初始化流程
- Java你可能不知道的事系列1