亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

.toArray(new MyClass [0])或.toArray(new MyClass

.toArray(new MyClass [0])或.toArray(new MyClass

catspeake 2019-10-08 11:03:19
假設我有一個ArrayListArrayList<MyClass> myList;我想調用toArray,是否有使用性能的理由MyClass[] arr = myList.toArray(new MyClass[myList.size()]);過度MyClass[] arr = myList.toArray(new MyClass[0]);?我更喜歡第二種樣式,因為它不太冗長,并且我假設編譯器將確保不會真正創建空數組,但是我一直在想那是否是真的。當然,在99%的情況下,它不會以一種方式或其他方式產生任何差異,但是我想在我的普通代碼和優化的內部循環之間保持一致的樣式...
查看完整描述

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;

}

使用第一種方法,以便僅創建一個對象,并避免(隱式但仍然很昂貴)強制轉換。


查看完整回答
反對 回復 2019-10-08
?
拉莫斯之舞

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中可能更快)。


查看完整回答
反對 回復 2019-10-08
  • 3 回答
  • 0 關注
  • 1008 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號