3 回答

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

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