List.toArray()用法詳解

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

若是要把一個List直接轉化爲Object數組,則能夠直接使用Object[] o = list.toArray();java

若是要轉化爲String數組,則有如下兩種方式:數組

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

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

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

 

List list = new ArrayList();對象

 

   list.add(new Person());blog

 

   list.add(new Person());element

 

   list.add(new Person());get

 

   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,須要本身「手工」「逐個」進行類型轉換。

相關文章
相關標籤/搜索