Java List.toArray方法:為什么傳入數組長度大于List大小時,只有第一個空余元素被置為null?

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 值。 這是一種效率優先的設計選擇。

Java List.toArray方法:為什么傳入數組長度大于List大小時,只有第一個空余元素被置為null?

以上就是Java List.toArray方法:

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享