DIY主題討論10:集合轉數組

【DIY主題討論:集合轉數組】

1)ArrayList.toArray()推薦有參數,還是無參數,爲什麼?
Object[] toArray() :無參方法,返回一個數組,數組包含容器中的所有元素,但是返回時object,會造成類型丟失。
< T > T[] toArray(T[] a) :有參方法,返回一個數組,數組包含容器中的所有元素,返回結果的運行時類型和參數數組a的類型相同,而不是單純的object。


錯誤用法

String[] array4 = (String[]) list.toArray();

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
拋出Object無法轉化爲String異常

正確用法

// 調用無參構造方法,用object數組接收
Object[] array1 = list.toArray();
// 調用有參構造方法,需要先初始化數組
String[] array3 = new String[3];
list.toArray(array3);

使用ArrayList.toArray()的場景:

對比有參數無參數方法,推薦還說使用有參方法,範型的類型擦除對於項目的治理總是不友好的,對於轉換後數組的應用也不方便,無參方法我理解爲兼容過去沒範型的情況。
無參方法返回null的原因是沒有參數可以指定返回類型,但個人覺得使用前先創建好數組再賦值不如方法可以負責創建數組並返回結果的好,Arrays.copyOf本身也是可以支持返回數組的。

2)如果有參數,那麼參數的數組長度是多少?給出分析的邏輯思考。
參數數組長度爲集合長度。
原則一:創建數組是最好給定長度,避免數組擴容對性能的影響。在當前場景下,集合轉數組,集合的長度是確定的,所以數組的長度也就是確定的,可以直接給出數組長度。
原因二:當給定數組長度小於集合長度,list.toArray新建一個數組拷貝,給定數組長度大於集合長度,list.toArray可以賦值成功,超出部分數組仍爲null。

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);
    // 當數組長度大於集合長度,集合結尾處置爲null
    if (a.length > size) a[size] = null;
    return a;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章