我们在java开发的时候,经常会遇到要把数组转化为列表,或者列表转化为数组,但是有时候也会遇到奇怪的问题,下面来看一下代码:
可以看到程序先定义了五个元素的数组,再用数组的asList方法把数组转化为列表,那么,这边输出列表的大小的时候,输出的会是5吗?
事实上运行出来list.size()输出的确是1!!!(不信的小伙伴自己试着运行下哈~),那么这是为什么呢?其他的四个元素到哪里去了呢?
下面我们来看下asList()的源码:
T... a这里表示输入的是一个泛型变长参数,返回值为一个固定长度的列表。从这里就可以知道原因了,输入的参数要是泛型变长参数,而我们的基本类型是不能作为泛型参数的,要想作为泛型参数就必须要使用对应的包类型。那么到这里又有个问题了,那么传递一个int类型的数组的时候,为什么程序没有报错呢?其实,在java中,数组是一个对象,它是可以泛型化的,也就是说,是把一个int类型的数组作为了T的类型,所以转换后List里面就只有一个类型为int数组的元素,接着我们来打印看看元素是什么类型:
这里用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 基础版