ArrayList.toArray()用法詳解


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);


免責聲明!

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



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