List转数组toArray方法

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

 

 

 

posted @ 2017-04-15 20:46  茅坤宝骏氹  阅读(963)  评论(0编辑  收藏  举报