一、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; }