天為了把一個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,需要自己“手工”“逐個”進行類型轉換。