Java list.toarray() 方法詳解:為什么傳入數組長度大于 list 大小時,只有第一個空余元素被置為 NULL?
本文深入探討 Java 中 List.toArray() 方法的行為,特別是當傳入的數組長度大于 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]。這是因為 List.toArray(T[] a) 方法的實現機制。
根據官方文檔,如果傳入的數組 a 長度大于 List 的大小,則緊隨 List 元素之后的第一個元素會被設置為 null,其余元素保持不變。
立即學習“Java免費學習筆記(深入)”;
讓我們分析 ArrayList 的源碼 (部分代碼片段):
@SuppressWarnings("unchecked") public <T> T[] toArray(T[] a) { int size = size(); 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; }
這段代碼清晰地表明,當 a.length > size 時,只有 a[size] (緊隨 List 元素后的第一個元素) 被設置為 null。 List.of() 創建的不可變列表的實現也遵循類似的邏輯。
因此,在例子中,[12, 34, 56] 之后,只有第四個元素被設置為 null,其余元素保留了原數組的值。 這種設計避免了不必要的內存分配,并允許用戶通過檢查第一個 null 元素來確定 List 的實際大小,前提是 List 本身不包含 null 值。 這是一種效率優先的設計選擇。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦