List.toArray()用法詳解


天為了把一個ArrayList直接轉化為一個String數組,着實費了一番功夫,后來經百度后才搞定,總結如下:

如果要把一個List直接轉化為Object數組,則可以直接使用Object[] o = list.toArray();

如果要轉化為String數組,則有以下兩種方式:

方法一、String[]  arr = new String[list.size];  list.toArray(arr);//此時arr就有了list中的值了

方法二、String[] arr = (String[])list.toArray(new String[0]);

下面是更詳細的說明:[轉自http://hi.baidu.com/happy19840402/blog/item/3b12a610b45353f9c3ce7984.html]

 

List list = new ArrayList();

 

   list.add(new Person());

 

   list.add(new Person());

 

   list.add(new Person());

 

   Person[] person = (Person[]) list.toArray();

 

運行程序會拋出異常:java.lang.ClassCastException

 

但運行如下代碼:

 

List list = new ArrayList();

 

   list.add(new Person());

 

   list.add(new Person());

 

   list.add(new Person());

 

   Person[] person = (Person[]) list.toArray(new Person[0]);

 

程序正確執行,

 

原因,先看ArrayList的兩個toArray()方法的源代碼:

 

public Object[] toArray() {

 

    Object[] result = new Object[size];

 

    System.arraycopy(elementData, 0, result, 0, size);

 

    return result;

 

}

 

 

 

public Object[] toArray(Object a[]) {

 

    if (a.length < size)

 

        a = (Object[])java.lang.reflect.Array.newInstance(a.getClass().getComponentType(), size);

 

    System.arraycopy(elementData, 0, a, 0, size);

 

    if (a.length > size)

 

        a[size] = null;

 

    return a;

 

}

 

可以看出,不帶參數的toArray方法,是構造的一個Object數組,然后進行數據拷貝,此時進行轉型就會產生ClassCastException而帶參數的toArray方法,則是根據參數數組的類型,構造了一個對應類型的,長度跟ArrayList的size一致的空數組,雖然方法本身還是以Object數組的形式返回結果,不過由於構造數組使用的ComponentType跟需要轉型的ComponentType一致,就不會產生轉型異常。

 

那么,對於不帶參數的toArray方法,它有什么特殊意義呢?還是用代碼說話:

 

ArrayList list = new ArrayList();

 

list.add(new Person());

 

list.add(new Person());

 

list.add(new Person());

 

//這里不需要轉型,也不能使用轉型

 

Object[] ss = list.toArray();

 

//這里可以進行轉型,取出原ArrayList里面存放的對象

 

for (int i = 0; i < ss.length; i++)

 

{Person person= (Person) ss[i];

 

System.out.println(person);

 

}

 

是說,如果用toArray,需要自己“手工”“逐個”進行類型轉換。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM