3 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
從Java 5中的ArrayList開始,如果數(shù)組具有正確的大?。ɑ蚋螅?,則將已填充該數(shù)組。所以
MyClass[] arr = myList.toArray(new MyClass[myList.size()]);
將創(chuàng)建一個(gè)數(shù)組對象,填充它并將其返回到“ arr”。另一方面
MyClass[] arr = myList.toArray(new MyClass[0]);
將創(chuàng)建兩個(gè)數(shù)組。第二個(gè)是長度為0的MyClass數(shù)組。因此,有一個(gè)對象創(chuàng)建對象,該對象將立即被丟棄。就源代碼而言,編譯器/ JIT無法優(yōu)化此代碼,因此無法創(chuàng)建它。此外,使用零長度對象會導(dǎo)致toArray()方法中的轉(zhuǎn)換。
請參見ArrayList.toArray()的來源:
public <T> T[] toArray(T[] a) {
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;
}
使用第一種方法,以便僅創(chuàng)建一個(gè)對象,并避免(隱式但仍然很昂貴)強(qiáng)制轉(zhuǎn)換。

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
通過JetBrains Intellij Idea檢查:
有兩種樣式可以將集合轉(zhuǎn)換為數(shù)組:使用預(yù)大小數(shù)組(如c.toArray(new String [c.size()]))或使用空數(shù)組(如c.toArray(new String [ 0])。
在較早的Java版本中,建議使用預(yù)大小的數(shù)組,因?yàn)閯?chuàng)建適當(dāng)大小的數(shù)組所需的反射調(diào)用非常慢。但是,由于OpenJDK 6的更新較晚,因此此調(diào)用變得很有趣,與空大小版本相比,空數(shù)組版本的性能相同,有時(shí)甚至更好。同樣,傳遞預(yù)大小的數(shù)組對于并發(fā)或同步收集也是危險(xiǎn)的,因?yàn)樵趕ize和toArray 調(diào)用之間可能會發(fā)生數(shù)據(jù)爭用 ,如果在操作期間同時(shí)縮小了集合,則在數(shù)組末尾可能會導(dǎo)致額外的null。
此檢查允許遵循統(tǒng)一的樣式:使用空數(shù)組(在現(xiàn)代Java中建議使用)或使用預(yù)定大小的數(shù)組(在較早的Java版本或基于非HotSpot的JVM中可能更快)。
添加回答
舉報(bào)