深入理解Java List.toArray(T[] a) 方法及運行結果
Java中的List.toArray()方法用于將List集合轉換為數組。然而,List.toArray(T[] a)方法的行為并非總是那么直觀,尤其是在傳入預分配數組作為參數時。本文將詳細分析該方法的運行機制,并解釋為什么示例代碼的結果并非預期的[12, 34, 56, NULL, null, null],而是[12, 34, 56, null, 32, 1]。
關鍵在于理解List.toArray(T[] a)方法參數的作用。當提供一個預先分配好的數組a作為參數時,方法的行為取決于該數組長度與List大小的比較。
JavaDoc文檔明確指出:如果傳入數組長度大于List大小,則List元素復制到數組后,數組中緊隨List元素后的第一個元素將被設置為null,其余元素保持原樣。
立即學習“Java免費學習筆記(深入)”;
讓我們分析ArrayList的源碼:System.arraycopy(elementData, 0, a, 0, size); 這行代碼將List元素復制到數組a。緊接著,if (a.Length > size) a[size] = null; 這行代碼只將數組中緊隨List元素后的第一個元素設置為null。
在示例代碼中,List.of(12, 34, 56) 創建了一個包含三個元素的List。傳入的數組new Integer[]{1, 2, 1, 43, 32, 1} 長度為6。toArray方法將List的三個元素復制到數組的前三個位置,并將第四個位置設置為null。剩余元素(數組中已存在的元素)保持不變。因此,最終結果為[12, 34, 56, null, 32, 1],而不是[12, 34, 56, null, null, null]。
UnmodifiableList的實現邏輯與ArrayList類似,盡管內部實現細節可能不同,但在數組長度大于List長度的情況下,也只會將緊隨List元素后的第一個元素設置為null。 因此,ArrayList和UnmodifiableList的toArray(T[] a)方法行為一致。