1. API
Object[] toArray()
按适當順序(從第一個到最後一個元素)傳回包含此清單中所有元素的數組。
T[] toArray(T[] a)
按适當順序(從第一個到最後一個元素)傳回包含此清單中所有元素的數組;傳回數組的運作時類型是指定數組的運作時類型。
2. 源碼
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
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;
}
3. 用法
當使用
ArrayList
時,有時想獲得一個實際的數組,這個數組包含了清單的内容。
可以通過調用方法
toArray()
來實作。
示例:
List<Integer> list = new ArrayList<>();
for (int i = 0; i< 10; i++) {
list.add(i);
}
System.out.println("List<Integer> 類型對象:");
System.out.println(list);
System.out.println();
System.out.println("Object[] 類型對象:");
Object[] integerObjs = list.toArray();
System.out.println(Arrays.toString(integerObjs));
System.out.println();
System.out.println("Integer[] 類型對象: ");
Integer[] integers = list.toArray(new Integer[list.size()]);
System.out.println(Arrays.toString(integers));
System.out.println();
System.out.println("int[] 類型對象:");
int[] ints = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
ints[i] = list.get(i);
}
System.out.println(Arrays.toString(ints));
輸出:
List<Integer> 類型對象:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Object[] 類型對象:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Integer[] 類型對象:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
int[] 類型對象:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4. 總結
可以看出,不帶參數的
toArray()
方法,是構造的一個
Object
數組,然後進行資料copy,此時進行轉型就會産生
ClassCastException
。
而帶參數的
toArray(T[] a)
方法,則是根據參數數組的類型,構造了一個對應類型的,長度跟
ArrayList
的size一緻的空數組,雖然方法本身還是以
Object
數組的形式傳回結果,不過由于構造數組使用的元件類型跟需要轉型的元件類型一緻,就不會産生轉型異常。
正确方法:
1. String[] str_a = (String []) arr.toArray(new String[0]);
2. String[] a = new String[size];
String [] str_a = (String []) arr.toArray(a);