深入剖析Java List.toArray(T[] a)方法的工作機制
在Java開發中,List.toArray(T[] a)方法是將List集合轉換為數組的常用手段。然而,其運行機制并非總是那么直觀。本文將深入探討該方法的內部原理,并解釋一個常見的誤解。
讓我們來看一個例子:
List<Integer> list = List.of(12, 34, 56); Integer[] array = list.toArray(new Integer[]{1, 2, 1, 43, 32, 1}); System.out.println(Arrays.toString(array));
這段代碼的輸出結果是[12, 34, 56, NULL, 32, 1],這與許多開發者預期的[12, 34, 56, null, null, null]有所不同。為什么會這樣呢?
立即學習“Java免費學習筆記(深入)”;
關鍵在于List.toArray(T[] a)方法的實現細節。Java文檔指出,如果傳入的數組長度大于List的元素數量,則List元素復制到數組后,緊隨其后的數組第一個元素將被設置為null。 并非所有剩余元素都將被填充為null。
讓我們觀察ArrayList的源碼片段(雖然List.of()創建的列表并非ArrayList,但其toArray方法的邏輯類似):
@SuppressWarnings("unchecked") public <T> T[] toArray(T[] a) { if (a.length > size) // 如果數組長度大于列表大小 a[size] = null; // 將列表元素之后數組的第一個元素設置為null return a; }
這段代碼清楚地表明,當傳入數組長度超過List長度時,只有緊跟在List元素后的第一個數組元素會被賦值為null。
回到之前的例子,List.of(12, 34, 56)包含三個元素,而傳入的數組new Integer[]{1, 2, 1, 43, 32, 1}長度為六。toArray方法將12, 34, 56復制到數組的前三個位置,并將第四個位置設置為null,其余元素保持原樣,最終結果為[12, 34, 56, null, 32, 1]。這與Java文檔的描述完全一致。
因此,理解List.toArray(T[] a)方法的這一特性對于避免潛在的編程錯誤至關重要。只有在充分了解傳入數組大小和List元素數量關系的情況下,才能正確解讀和利用該方法的返回值。