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