toArraypublic <T> T[] toArray(T[] a)    返回一个按照正确的顺序包含此列表中所有元素的数组;返回数组的运行时类型就是指定数组的运行时类型。如果列表能放入指定的数组,则返回放入此列表元素的数组。否则,将根据指定数组的运行时类型和此列表的大小分配一个新的数组。    如果指定的数组能容纳列表并有剩余空间(即数组的元素比列表的多),那么会将数组中紧跟在集合末尾的元素设置为 null。这对确定列表的长度很有用,但只 在调用方知道列表中不包含任何 null 元素时才有用。    指定者:
        接口 Collection<E> 中的 toArray
    指定者:
        接口 List<E> 中的 toArray
    覆盖:
        类 AbstractCollection<E> 中的 toArray    参数:
        a - 要存储列表元素的数组,如果它足够大的话;否则,它是一个为存储列表元素而分配的、具有相同运行时类型的新数组。 
    返回:
        包含列表元素的数组。 
    抛出:
        ArrayStoreException - 如果 a 的运行时类型不是此列表中每个元素的运行时类型的超类型。

解决方案 »

  1.   

    jdk源码:
    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);
            if (a.length > size)
                a[size] = null;
            return a;
        }
      

  2.   

    看下api的解释就会明白了,该方法的做用为:
    返回一个按照正确的顺序包含此列表中所有元素的数组;返回数组的运行时类型就是指定数组的运行时类型。如果列表能放入指定的数组,则返回放入此列表元素的数组。否则,将根据指定数组的运行时类型和此列表的大小分配一个新的数组。
    如果指定的数组能容纳列表并有剩余空间(即数组的元素比列表的多),那么会将数组中紧跟在集合末尾的元素设置为 null。这对确定列表的长度很有用,但只 在调用方知道列表中不包含任何 null 元素时才有用。 LZ代码中的list的元素个数为0,指定的t数组是能容下的,所以会出现这种情况,如果list中有元素,并且比t数组元素个数多,那返回的就是list中元素了,如果list中有元素,但比t数组元素个数少,比如list中有个“1”,返回值为: "1",null,"b","c"
    具体LZ可以试一下!
      

  3.   


            String[] a = {"a","b","c","d"};
            List<String> list = new ArrayList<String>();
            Object[]elementData =list.toArray();
            int size = list.size();
            System.out.println("size = " + size);
            if (a.length < size){
             System.out.println("111111111111111");
                a = (String[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);}
            System.arraycopy(elementData, 0, a, 0, size);
            if (a.length > size){
             System.out.println("2222222222222");
                a[size] = null;}
            
            System.out.println(a[0]);
            for(String aa : a){
                System.out.println(aa);
            }这个是把jdk源码中的代码放到自己程序里面的程序
    当size=0的时候  toArray方法就把传入的数组中的[0]位设置成null了
    并把传入的这个数组返回。
    所以数组的第一个元素为null其他元素不变但是jdk为什么这么设计呢?。谁解答一下