文档章节

避免基本类型数组转换列表陷阱(Arrays.asList())

那位先生
 那位先生
发布于 2013/08/20 15:09
字数 476
阅读 78
收藏 0

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

本文转载自:http://blog.csdn.net/p106786860/article/details/10094717

共有 人打赏支持
那位先生
粉丝 130
博文 58
码字总数 65010
作品 0
深圳
后端工程师
Arrays.asList陷阱

代码如下 public static void main(String[] args) { int[] data = {1,2,3,4,5}; List list = Arrays.asList(data); System.out.println("列表中的元素数量是:" + list.size()); } 注意这里......

肥猫钓鱼
2014/03/20
0
0
Arrays.asList的用法:

Arrays.asList 返回数组而非List。 List的一个典型的特性就是其长度是可变的,我们可以很方便地对它进行插入和删除元素的操作,这是它与数组所存在的一个很大的区别,后者的长度是固定的,而...

文文1
2015/09/09
174
0
Java基本类型数组转ArrayList

先来看源码 当我们调用Arrays.asList(array) 时,实际是执行了包可见的ArrayList的构造函数(注意通常这个构造函数对用户是不可见的,所以不能通过) 由于a是一个E[]数组,E又是ArrayList的泛...

微流
2016/05/26
0
0
java中数组与List相互转换的方法

1.List转换成为数组。(这里的List是实体是ArrayList)   调用ArrayList的toArray方法。   toArray   public <T> T[] toArray(T[] a)返回一个按照正确的顺序包含此列表中所有元素的数组...

Carl_
2014/09/16
0
0
Arrays.asList(T... a) 不转换基本类型数组值为list

随手总结一下,数组转换为list总结 int[] a1 = new int[] { 1, 2, 3, 4 }; String[] a2 = new String[] { "srt1", "srt2", "srt3", "srt4" }; System.out.println(a1.getClass().getName() +......

Nika
2011/08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java IO类库之PrintStreamWriter

* A <code>PrintStream</code> adds functionality to another output stream, * namely the ability to print representations of various data values * conveniently. Two other fea......

老韭菜
54分钟前
0
0
qduoj~前端~二次开发~笔记

青岛大学qdu的onlinejudge是js的写的前端,框架是vue.js,在nodejs上部署运行,其实整体运行还是建立在docker的容器虚拟环境里,这里暂时不需要docker。安装环境是Ubuntu14-64bit 1.安装一大...

虚拟世界的懒猫
57分钟前
6
0
ConcurrentHashMap源码解读

部分内容转自:http://jiabinyuan.xyz/#/app/archive/detail/25 内部结构 内部采用了segment结构,每一个segment相当于一个hashtable。看下面的结构图: 从图的结构我们可以了解到,Concurr...

edwardGe
今天
1
0
Ubuntu终端Tab键自动补全

打开 /etc/bash.bashrc,找到下列代码,取消注释。 #enable bash completion in interactive shells#if ! shopt -oq posix; then# if [-f /usr/share/bash-completion/bash_compl......

大熊猫
今天
0
0
polipo socks5代理转http代理

天朝的网络,哎~ 装个 yarn 都时而会卡 假设在SSlocal 已经装好运行的前提下,来安装设置 polipo sudo apt-get install polipo sudo vim /etc/polipo/config 追加下列配置内容,并保存 socksP...

纯洁徐
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部