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