JAVA学习笔记 -- ”诡异“的List和Array转换

本文详细探讨了Java中List和Array之间的转换方法。通过Collection的toArray()方法可安全地将List转换为Array;而通过Arrays的asList()方法将Array转换为List时,会产生视图而非独立对象,导致Array与List间数据的相互影响。此外,还讨论了toArray()方法的使用细节及向下转型的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看看List和Array怎样转换。

List --> Array :

Collection这个接口提供了一个 toArray()方法,所以要将任何一个Collection的实现转换为Array,调用这个函数就好了:

List<Integer> list = new LinkedList<Integer>(); //........ Object[] objArray = list.toArray();

Array --> List :

Arrays这个类提供了一个 asList()的函数:

Integer[] array = new Integer[20]; //.......... List<Integer> list = Arrays.asList(array);

貌似到这里,问题就解决了。可是如果确实如此的话,我也不用写这篇blog了。

问题出在asList()这个函数上,这是它的完整定义:

public static <T> List<T> asList(T... a)

但其实,它返回的不是一个”完整的“List对象,而是一个视图(View)。这意味着什么呢?在上面的示例代码中,如果我们改变array中的元素,那么list中的元素也会相应的改变。实际上,array和list指向的是同一组数据。

但是,toArray()这个函数又不存在这个问题。toArray()返回的是一个”safe“的数组。意思就是toArray()会将List中的数据通过值传递的方式拷贝到新的数组中,List中的数据和新创建的数组中的数据不存在引用。在第一组示例代码中,如果改变list中的元素,不会影响到array中的数据。

很有趣吧,看上去是一个双向的转换,但其实asList()和toArray()在语义上有着很大的差别。

问题还没完呢,接着再详细讨论一下toArray():

public Object[] toArray()

可以看出,toArray返回的是一个类型为Object[]的对象。现在再来看一段代码:

List<Integer> list = new LinkedList<Integer>(); Object[] objArray = list.toArray(); Integer[] intArray = (Integer[]) objArray; //error

当执行到第三句的时候,会抛出异常”java.lang.ClassCastException“。why?
我没有找到很正式的答案,可以简单的认为数组不支持向下转型。或者可以这样认为,只有当一个父类的引用指向子类对象时,这个父类的引用才能够向下转换成子类引用。而objArray的类型就是Object,intArray的类型是Integer,这两都是实例对象,你不能够将一个Object的对象转换为Integer的对象。

难道没有一个办法能够将list.toArray()返回的结果转换成对应类型的数据了吗?

当然有。

最简单的办法:

List<Integer> list = new LinkedList<Integer>(); Integer[] intArray = (Integer[]) list.toArray(new Integer[0]);

呵呵,看懂了这段代码吗,其实就是调用Collection接口提供的另外一个函数:

public Object[] toArray(Object[] a)

具体的用法看JAVADoc吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值