把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 ...
随机推荐
- selector函数指针回调机制
selector可以叫做选择器,其实指的就是对象的方法,也可以理解为C语言里面的函数指针,在面向对象里面的对应概念. [self performSelector:@selector(Hidden) w ...
- sin()函数的实现
计算如下公式,并输出结果: 其中r.s的值由键盘输入.sin x的近似值按如下公式计算,计算精度为10-10: 程序说明: #include <math.h>和#include<cm ...
- beautifulsoup简单用法
原文地址 http://www.cnblogs.com/yupeng/p/3362031.html 这篇文章讲的也很全 http://www.cnblogs.com/twinsclover/archi ...
- 一个完整的 JS 身份证校验代码
一个完整的 JS 身份证校验代码 身份证号码是由 18 位数字组成的,它们分别表示: (1) 前 1.2 位数字表示: 所在省份的代码; (2) 第 3.4 位数字表示: 所在城市的代码; (3) 第 ...
- poj1040 Transportation(DFS)
题目链接 http://poj.org/problem?id=1040 题意 城市A,B之间有m+1个火车站,第一站A站的编号为0,最后一站B站的编号为m,火车最多可以乘坐n人.火车票的票价为票上终点 ...
- ubuntu 防火墙关闭的80端口,开启方法
#关闭防火墙 /etc/init.d/iptables stopservice iptables stop # 停止服务#查看防火墙信息/etc/init.d/iptables status #开放端 ...
- Java导出数据生成Excel表格
事先准备: 工具类: package com.wazn.learn.util.export; import java.sql.Connection; import java.sql.DriverMan ...
- spring完成自动装配
让spring完成自动装配 Autowiring 解决标签为javaBean注入时难以维护而实现的 下面是几种autowire type的说明: 1,byname:试图在容器中寻找和需要自动装配的属性 ...
- [APIO2010]特别行动队 --- 斜率优化DP
[APIO2010]特别行动队 题面很直白,就不放了. 太套路了,做起来没点感觉了. \(dp(i)=dp(j)+a*(s(i)-s(j))^{2}+b*(s(i)-s(j))+c\) 直接推出一个斜 ...
- 【BIT套主席树】COGS257-动态排名系统
题意同BZOJ1901,多组数据,数据范围也不一样.重新写一遍复习一下. #include<iostream> #include<cstdio> #include<cst ...