2013-10-30 62 views
0

我想知道是否有性能上的區別,如果我使用一個原始數組,然後重建它添加新元素是這樣的:
性能基本數組VS ArrayList的

AnyClass[] elements = new AnyClass[0]; 

public void addElement(AnyClass e) { 
    AnyClass[] temp = new AnyClass[elements.length + 1]; 
    for (int i = 0; i < elements.length; i++) { 
     temp[i] = elements[i]; 
    } 
    temp[elements.length] = e; 
    elements = temp; 
} 

,或者如果我只是用一個ArrayList and add的元素。

我不確定這就是爲什麼我問,速度是否相同,因爲ArrayList的構建方式與我對基元數組所做的相同,或者確實存在差異,並且基本數組總是更快即使我每次添加元素時都重建它?

+1

當你有很好的測試實現,你爲什麼要實現自己的? – kosa

+0

它只是表現我問我自己是否可以使用原始類型改進它 – Nickolaus

+0

這將非常容易實現這兩種解決方案並運行基準測試,比較兩者之間的速度。 – ricksuggs

回答

4

ArrayLists以類似的方式工作,但每次達到限制時每次都會增加容量,而不是重新構建。所以如果你不斷加入它,ArrayLists會更快,因爲重新創建數組相當緩慢。 因此,如果您不經常添加內存,您的實現可能會使用較少的內存,但只要速度變慢,大部分時間內它會變得更慢。

+0

謝謝你的回答,它很清楚爲什麼ArrayList是更好的解決方案(通常所說的),但如果我知道我的數組將在最小和最大大小之間的範圍內,我可以提高性能,如果我分配一個固定數量的元素(例如100),如果陣列的最大尺寸? – Nickolaus

+0

如果你的範圍非常緊張是的。但是對於100的範圍沒有。隨着新的實施,你將不得不重新調整100次,這將是非常昂貴的。你可以告訴ArrayList以100的大小開始,所以它只需調整一次即可達到200的大小。 – Todoy

+2

@Nickolaus:正確的解決方案是使用其他構造函數創建預定義的'ArrayList' 。 – maaartinus

1

簡而言之,堅持ArrayList。它是:

  • 廣爲人知;
  • 經過充分測試;
  • 可能會更高性能,您自己的實現(例如,ArrayList.add()保證是amortised constant-time,您的方法不是)。
2

當一個ArrayList調整大小時,它自身加倍,這樣你就不會浪費時間調整每次的大小。分期付款,這意味着它不需要任何時間調整大小。這就是爲什麼你不應該浪費時間重新創造輪子。創建第一個人的人已經學會了如何提高效率,並且比平臺更瞭解平臺。

0

就速度而言,您的實現很可能會明顯失去Java的ArrayList。你所做的一件特別昂貴的事情是每當你想添加元素時重新分配數組,而Java的ArrayList在重新分配之前試圖通過一些「緩衝區」進行優化。

1
  • 在數組和ArrayList中都沒有性能問題。
  • 數組和ArrayList是基於索引的,所以兩者都以相同的方式工作。
  • 如果你需要動態數組,你可以使用arrayList。
  • 如果數組大小是靜態的,則使用Array。
0

ArrayList也將在內部使用Array Only,所以這是真的Array將比ArrayList快。編寫高性能代碼時總是使用Array。出於同樣的原因,Array對於大多數集合而言都是骨幹的。 您必須通過Collections的JDK實現。 我們使用的時候我們正在開發一些應用ArrayList和我們不關心這樣小的性能問題,我們也進行權衡,因爲我們已經得到書面API投入,獲取,調整等

0

語境是非常重要的:我的意思是如果您不斷插入新項目/元素ArrayList肯定會比Array更快。另一方面,如果您只想訪問已知位置上的元素 - 例如arrayItems[8]ArrayArrayList.get(8)更快;正弦有get()函數調用開銷和其他步驟和檢查。