2013-12-08 47 views
3

當循環寫,我們可以寫類似的代碼:其中迭代法使用面向Java的ArrayList

ArrayList<Object> myList = ... 

for(int i=0; i < myList.size(); i++){ 
    ... 
} 

這樣,我們調用每次.size()。它是更好地得到大小在變量和使用,即

ArrayList<Object> myList = ... 

int listSize = myList.size(); 

for(int i=0; i < listSize ; i++){ 
    ... 
} 

而且還有另一種方法迭代,即

for (Object o : myList) { ... } 

哪個迭代法應被用於高效的編碼初步實踐?

謝謝

+0

dup http://stackoverflow.com/questions/6540511/time-complexity-for-java-arraylist –

+1

儘可能使用最後一個。 – Ingo

+0

@Ingo你能解釋一下我們爲什麼要這樣嗎? – giga

回答

3
  1. 是的,size是一個恆定時間操作。
  2. 由於您使用的是具體類型ArrayList,調用幾乎肯定會由JIT編譯器內聯。
  3. 內聯也可能爲吊裝打開大門,所以實際的機器代碼將與您手動將大小提取到局部變量中一樣。
  4. 它幾乎從來都不會考慮它是否被內聯/懸掛。
  5. 如果循環運行至少100k次迭代,在體內幾乎不做任何事情,並且內循環執行多次,那麼開始有意義地懷疑size調用的性能影響。
3

檢查implementation。是的,它的運行時間不變,有一個字段可以保存大小。

2

應儘可能使用for-each操作符(即:無論何時不在其間修改列表),因爲它允許列表選擇最有效的處理模式。

如果你必須使用一個for循環,就可以解決的,持續的檢查以非常簡單的方式,通過反向運行:

for (int i = list.size()-1; i>= 0; --i) 

編輯:作爲馬爾科Topolnik的評論,我寫了小程序來測試迭代器的效率,結果證明迭代器實際上是比指數執行更快。代碼見here

只有當JVM已經完全優化了代碼時,纔會出現這種情況,否則迭代器比索引實現慢大約2%,但即使如此,這對於正常的程序執行來說也不是相關的時間。

+0

或'for(int i = 0,size = list.size(); i

+0

這當然是可能的,但像他的第二個聲明一樣,只是更緊湊。 – TwoThe

+0

它減小了size變量的範圍,使得它更少出錯。 –