2012-12-13 28 views
5

在我的代碼迴路,使用的for-each在java中

for(City city : country.getCities()){ 
    // do some operations 
} 

使用country.getCities()是昂貴嗎? JVM會爲每次調用維護堆棧跟蹤嗎?

List<City> cityList = country.getCities(); 
for(City city : cityList){ 
    // do some operations 
} 

什麼是最佳使用方法?

回答

9

沒有,這個循環:

for(City city : country.getCities()) 

只會調用country.getCities()一次,然後遍歷它。它不會爲循環的每次迭代調用它。在你的情況下,它相當於:

for (Iterator<City> iterator = country.getCities().iterator(); 
    iterator.hasNext();) { 
    City city = iterator.next(); 
    // do some operations 
} 

重寫它沒有任何好處根據您的第二個片段。

查看section 14.14.2 of the JLS瞭解更多詳情。

+0

有一個好處,用明確的迭代器編寫長版本允許你做iterator.remove(),你不能用簡短版本 – portforwardpodcast

+0

@portforwardpodcast:當然,但這就好像說用'for '循環和'get'因爲那麼你已經有了索引。在這裏實際提供的代碼中,沒有任何好處。 –

3

在這兩種情況下,getCities()只被調用一次。

默認免責聲明:和往常一樣,您幾乎不需要擔心性能,因爲編譯器比人好得多。

1

這些是等同的。 getCities()將只執行一次。 (如果你在該方法中使用System.out.println(),你應該看到這一點)。

需要注意的是它不會叫getCities()多次不只是爲了性能的原因,也是因爲有不能保證它會返回相同的集合每次(也可能是直觀的,它返回相同的集合,但沒有規定)

我寧願你的第一個例子簡潔。

0

兩者都是一樣的,沒有區別。並且country.getCities()將在循環中被調用一次。

我認爲第一個更好,因爲沒有使用額外的參考。

0

JVM將在編譯時優化代碼,以確保country.getCities()方法被調用一次。

您應該按照您和/或您的團隊認爲最具可讀性的方式編寫代碼。