在多夫布爾卡的Java性能和可擴展性:第1卷,筆者提到,遍歷一個ArrayList
與作爲Java的ArrayList的for循環優化
for (int i = 0; i < vector.size(); i++) {
// do something that does not modify vector size...
}
一些諸如其實是因爲一個小的優化問題的vector.size()
常數計算,因此暗示一些諸如
int size = vector.size();
for (int i = 0; i < size; i++) {
// do something that does not modify vector size...
}
實際上會更有效。由於該書是在2000年編寫的,作者正在使用Sun 1.2.2 JDK。
這種情況對於較新的JDK是否仍然適用?或者,Java編譯現在足夠聰明,可以消除這些低效率,儘管它們可能有多小。編輯:我不擔心在我的代碼中這些微小的優化;我不擔心在我的代碼中這些微小的優化;我不擔心。我只是對JDK的發展感到好奇。
除非您可以證明重複調用'size()'是代碼中的瓶頸,否則不要浪費時間去擔心這種微優化。無論如何,這種優化在某些條件下才是安全的(即當你處於循環中時,沒有其他線程可以改變'vector'的大小)。 –
考慮使用'for-each'循環,而不用擔心'List <>'的內部。在java 8中,'List#forEach(...)'將會更加隱藏它。 – bradimus
但是,「循環中不做某件事,除非你絕對必須在循環中執行」的基本規則仍然適用。無論技術如何發展,在循環中減少計算是件好事。 –