把Java数组转换为List时的注意事项
本文由 ImportNew - 飘扬叶 翻译自 mlangc。欢迎加入翻译小组。转载请见文末要求。
不幸的是并不是每件事都尽如人意。举个例子,现在将一个Java数组转换为List。当然,我们可以使用Arrays.asList方法,但是如果没有慎重思考就随便使用几乎肯定会产生令人讨厌的意外。考虑完下面这段程序并预测其输出你就明白我的意思了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package com.wordpress.mlangc.arrays; import java.util.Arrays; public class ArraysToList { public static void main( final String[] args) { 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" )); } } |
由于Javadoc对Arrays.asList的说明相当模糊,对你来说预测出程序的运行结果可能有点困难,下面我们来一步步的揭晓答案:
- 第9行就像我们根据API所预测的那样在我们的控制台输出了“[a,b]”,这正是我们乐意看到的。
- 第12行也一样如预期那样输出了“[1,2]”。
- 第15行就不同了,当然这里不是说15与12的不同,而是一个是int另一个是Integer,因此在我们的控制台打印出了类似这样的结果“[[I@39172e08]”,这就不再如预期那样了。我们得到一个包含数组中标识每个元素唯一性的地址串的list,而不是包含两个Integer对象的list。
- 看到上面的结果后,对于第18行输出的类似“[[Ljava.lang.String;@20cf2c80, c]”这样的结果就不会感到惊奇了。
但是发生了什么呢?前两个打印语句与我们预期的结果相同,因Java语言规范规定了调用一个声明为foo(T… t)的方法,比如foo(new T[]{bar,baz})等同于foo(bar,baz)这样的调用。在Arrays.asList方法中T是参数类型,因此它必须为一个Object 类型,但是int不是,而int[]却是。这就是为什么第16行的声明等同于 Arrays.asList(new Object[] { new int[] { 1, 2 } })。
1
|
Arrays.asList( new Object[] { new int [] { 1 , 2 } }) |
最后也是非常重要的一点,在第19行的声明从一开始就产生了调用问题。我们告诉编译器我们需要一个包含String数组和字符串的list,正如我们预期的那样我们得到了我们想要的东西。
到现在为止解释了这么多,但是我们还可以从中学到更多的东西:问题的真正来源并不是可变参数设计的很糟糕;相反的我认为这个设计很好。关于这个问题在《Effective Java2》第 42项规范中已经解释地很清楚了,Arrays.asList违反了该项规范,事实上Arrays.asList作为一个反面教材,告诉了我们在使用Java的可变参数设计API时为什么要非常小心。在这里我不会再重复那篇文章里的回答,但是你自己确实需要亲自去读一下它,但是考虑到完整性我必须指出 上面有问题的声明在使用Java1.4的编译器下编译的时候就会报错,这是相当好的。现在我们仍然会使用Arrays.asList,但是为了安全要求我 们知道所面临的问题的复杂性。下面是在将数组转换为lists的时候我们需要遵循的规则,做到这些可以确保没有任何意外的情况发生:
- 如果你要将一个数组转换为list时仅仅是要将其转换为一个string,那么最好使用Arrays.toString代替上面的方法吧。即使对于基本类型的数组该方法也不会出现任何问题。
- 如果你打算将一个基本类型的数组转换为所对应的封装类型的list,使用Apache Commons Lang吧,可能你的项目正在使用它,类似下面这样使用ArrayUtils.toObject:
1
|
List<Integer> list = Arrays.asList(ArrayUtils.toObject( new int [] { 1 , 2 })); |
- 如果你打算将一个引用类型的数组转换为list,可以直接使用Arrays.asList:
1
|
List<String> list = Arrays.asList( new String[] { "a" , "b" }); |
不要忘了告诉和你一起工作的人以确保他们不和你犯同样的错误。当然,你也可以选择仅仅记住那些使用Arrays.asList方法时可能出现问题的地方,并使用普通的for循环来代替,但是那会使你的代码很杂乱,还会带来性能方面的问题。
原文链接: mlangc 翻译: ImportNew.com- 飘扬叶
译文链接: http://www.importnew.com/14996.html
把Java数组转换为List时的注意事项的更多相关文章
- Java数组超出范围时如何处理多个异常?
在Java编程中,数组超出范围时如何处理多个异常? 此示例显示如何使用System类的System.err.println()方法处理多个异常方法. package com.yiibai; publi ...
- XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法
在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...
- 在Java中怎样把数组转换为ArrayList?
翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在S ...
- 将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)
方法一:使用Arrays.asList()方法 1 2 String[] asset = {"equity", "stocks", "gold&q ...
- java中把字节数组转换为16进制字符串
把字符串数组转换为16进制字符串 import java.security.MessageDigest; public class StringUtil { public StringUtil() { ...
- Java 中将字符串数组转换为字符串
Java 中将字符串数组转换为字符串 import java.util.Arrays; import java.util.HashSet; import java.util.Set; public c ...
- Java实现 LeetCode 108 将有序数组转换为二叉搜索树
108. 将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: ...
- 第5章 Java数组
1.什么是数组 数组可以想象成一个巨大的盒子,这个盒子里面存放的是同一个数据类型的数据 例如:int[] scores = {78,68,94,93}; 2.如何使用Java中的数组 2.1申明数组 ...
- JAVA数组与List相互转换
1.数组转成List 数组转成List可以用方法 :Arrays.asList,一起来了解一下 System.out.println(Arrays.asList(new String[] { &quo ...
随机推荐
- python进行des加密解密,而且可以与JAVA进行互相加密解密
import binasciifrom pyDes import des, CBC, PAD_PKCS5import uuidimport time # pip install -i https:// ...
- 关于Web2.0概念的一篇小短文
Web2.0程序设计的第一篇作业,写了就顺手放上来吧. 在互联网泡沫破裂数年后,Tim O'Reilly与John Battelle总结了互联网产业复兴过程中出现的一系列现象,在2004年举办的第一届 ...
- vue中methods、watch、computed之间的差别对比以及适用场景
首先要说,methods,watch和computed都是以函数为基础的,但各自却都不同: 一.computer 当页面中有某些数据依赖其他数据进行变动的时候,可以使用计算属性. <p id=& ...
- Centos bash: make: command not found
一般出现这个bash: make: command not found提示,是因为安装系统的时候使用的是最小化mini安装,系统没有安装make.vim等常用命令,直接yum安装下即可: yum -y ...
- Technology share: VR is coming,are you ready?
►Date 2016-10-18 ►Address 上海市浦东新区严家桥1号宏慧音悦湾3号楼5楼 VR SPACE ►Events 品牌如何抢先一步,借玩VR吸引眼球,如何让客户作为VR买单? 如何结 ...
- WPF 获取指定文件的Icon
C# var icon = System.Drawing.Icon.ExtractAssociatedIcon(@"filepath"); var m = new MemorySt ...
- 记一次ceph集群的严重故障
问题:集群状态,坏了一个盘,pg状态好像有点问题[root@ceph-1 ~]# ceph -s cluster 72f44b06-b8d3-44cc-bb8b-2048f5b4acfe ...
- LoadRunner项目结合抓包工具
LoadRunner项目结合抓包工具 常见的抓包工具包括: 1. Http协议 报文分为"请求","应答"两大类. 请求: 方法-URL-协议/版本 ...
- Java Integer Cache
Java Integer Cache Java 代码 public class IntegerDemo { public static void main(String[] args) { Integ ...
- 【fastadmin】 _id 功能失效解决办法
在add.html模版中修改对应的input标签的各种属性