Collection.toArray()和toArray(Object[])

Collection接口处于JAVA集合框架的最顶层,它的两个直接子接口List,Set和Map接口以及这三个接口的

子类构成了整
个JAVA2的集合框架。所以掌握Collection,List,Set,Map接口的定义是学习整个集合框架最基础也是最

重要的
部分。
在Collection接口中定义了两个方法:
public Object[] toArray();
public Object[] toArray(Object[]);
它们有什么区别呢,我们先看下面的列子:
(PS:由于ArrayList实现了List接口,所以这里的具体实现类我们就使用它来作演示)
...
List arrayList = new ArrayList();
//向列表中放入10个TestObj对象
for(int i=0;i<10;i++){
arrayList.add(new TestObj());
}

TestObj[] testObj = (TestObj[])arrayList.toArray(); //强制类型转换错误
TestObj[] testObj = (TestObj[])ArrayList.toArray(new TestObj[0]); //正确
...
同是强制类型转换为什么第一次会失败呢?
考虑一下所有集合类,我们在向集合中添加元素时,集合并不管理我们添加进的对象的运行时类型,
在集合看来我们放入的对象类型都为Object。所以我们才可以将不同的类的实例添加进同一个集合里,
尽管这样作没什么好处。
当我们调用toArray()时,集合并不知道其中对象的类型,所以就返回一个Object[]来。当强制
转换这个数组时就出错了,因为它的运行时类型就是Object[]。
当调用toArray(Object[])时发生什么呢?首先解释一下参数Object[],根据多态原则父类出现的地方都

可以
用子类代替,所以这里传入的参数可以是任何类型的数组(内置的除外)。JDK1.4的帮助文档中这样解

释这个
方法:该方法返回包含集合中所有元素的数组,数组的运行时类型为指定的数组(该方法的参数)。如

果该集
合能填充进传入的数组(大小足够)就返回该数组,否则就重新分配一个大小为集合的大小,运行时类型

为指定
数组的类型的数组。如果传入的数组比该集合大,那么将在填充完集合中的元素后再在数组中按顺序添

加一个
null。
在我们的第二个调用我们传入了一个长度为0的TestObj数组,很显然它的长度小于集合的大小,因此该

方法就
重新分配了一个大小合适类型为TestObj的数组,将集合元素填充进该数组后并返回。我们在接收到返回

值后,
虽然接口函数中它被定义为Object[],但实际上它的运行时类型为TestObj[],因此我们的转换才能成功



综上所述,
toArray()方法返回一个Object数组,该数组所含元素可以转换为对象本身的类型,但数组本身却不能,


为它的的确确是个Object类型的。
toArray(Object[])方法也返回一个Object数组,但该数组的运行时类型为参数指定的类型,可以转换为

对象本
身类型的数组。
toArray()等同于toArray(new Object[0])

在jdk1.5里由于支持了泛型,这两个方法的区别就很明显了。第二个方法将直接返回所指定的类型,无

需做转换。


这玩意是抄来的,加深影像,不怕他人狂骂我本是无赖...

你可能感兴趣的:(框架)