一、List.toArray方法
List提供了一个将List转为数组的一个非常方便的方法toArray。toArray有两个重载的方法:
Object[] | toArray() 返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。 |
<T> T[] | toArray(T[] a) 返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。 |
第一种重载方法,是将list直接转为Object[] 数组,并不是数组的原类型;
第二种方法是将list转化为你所需要类型的数组,当然我们用的时候会转化为与list内容相同的类型。
二、toArray编程规则
(1) Object[] toArray()方法
List list = new ArrayList();
list.add(new Student());
list.add(new Student());
list.add(new Student());
Student[] s = (Student[]) list.toArray();
运行程序会抛出异常:java.lang.ClassCastException
(2)T[] toArray(T[] a)方法 如果a数组的长度小于原数组的长度,则重新分配空间复制并返回,否则使用a数组复制并返回
List list = new ArrayList();
list.add(new Student());
list.add(new Student());
list.add(new Student());
Student[] student = (Student[]) list.toArray(new Student[0]);
运行结果正确
三、ArrayList toArray方法源码
(1)Object[] toArray()方法
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
Arrays类copyOf方法
public static <T> T[] copyOf(T[] original, int newLength) {
return (T[]) copyOf(original, newLength, original.getClass());
}
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
//判断类型是否为Object[]类型
T[] copy = ((Object)newType == (Object)Object[].class)
//Object[]类型实例化
? (T[]) new Object[newLength]
//非Object[]类型实例化
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
//复制数组
System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
return copy;
}
(2) T[] toArray(T[] a)方法
public <T> T[] toArray(T[] a) {
//传入的数组长度小于实际数组长度重新分配空间并复制数组
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
//复制数组
System.arraycopy(elementData, 0, a, 0, size);
//旧数组长度作为索引,指向新数组的空间赋值为null
if (a.length > size)
a[size] = null;
return a;
}