数组转化为列表的一个陷阱

我们在java开发的时候,经常会遇到要把数组转化为列表,或者列表转化为数组,但是有时候也会遇到奇怪的问题,下面来看一下代码:

数组转化为列表的一个陷阱

数组转为列表程序

可以看到程序先定义了五个元素的数组,再用数组的asList方法把数组转化为列表,那么,这边输出列表的大小的时候,输出的会是5吗?

事实上运行出来list.size()输出的确是1!!!(不信的小伙伴自己试着运行下哈~),那么这是为什么呢?其他的四个元素到哪里去了呢?

下面我们来看下asList()的源码:

数组转化为列表的一个陷阱

asList源码

T... a这里表示输入的是一个泛型变长参数,返回值为一个固定长度的列表。从这里就可以知道原因了,输入的参数要是泛型变长参数,而我们的基本类型是不能作为泛型参数的,要想作为泛型参数就必须要使用对应的包类型。那么到这里又有个问题了,那么传递一个int类型的数组的时候,为什么程序没有报错呢?其实,在java中,数组是一个对象,它是可以泛型化的,也就是说,是把一个int类型的数组作为了T的类型,所以转换后List里面就只有一个类型为int数组的元素,接着我们来打印看看元素是什么类型:

数组转化为列表的一个陷阱

返回的class类型

这里用String做个对比 更容易理解返回的是什么

数组转化为列表的一个陷阱

String的返回类型

getClass()是Object类的方法,返回的是此Object运行时的类,可以和String的对比发现刚才返回的代表是int型的数组,因为java里面Array是属于java.lang.reflect包(反射包,有兴趣的小伙伴可以去了解下反射的机制),它是通过反射访问数组元素的工具类。java并没有定义数组这一个类,是在编译器编译的时候生成的,是一个特殊的类。所以知道了这个原因,上面的代码就好改了,只要把int转化为包装类型就可以了:

数组转化为列表的一个陷阱

修改的代码以及结果

所以在数组转换为列表的时候,要注意asList方法的陷阱。

好了今天就到这里~喜欢的关注一波~~谢谢大家的收看~~

附上今天的十个单词:

flush 清空

DataInputStream 二进制文件读取

DataOutputStream 二进制文件写出

encoding 编码

remote 远程

release 释放

JBuilder Java继承开发环境

enterprise 企业版

developer 开发版

foundation 基础版

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值