2014-09-12 93 views
5

我有以下代碼:Java高級循環:什麼是(不)評估循環的頭?

for (Attribute thisAttribute : factor.getAttributes()) { 
// blabla 
} 

其中factor.getAttributes()回報List<Attribute>

顯然,只有一個初始調用factor.getAttributes()然後遍歷開始。但是,我不明白爲什麼只有一個電話。如果我在常規的for()循環的頭文件中包含一個函數調用,我相信它將在每次迭代中進行評估。在這方面,高級循環的方式和原因有何不同?

+0

對於每個迴路是對於正常的循環來說有點不同。 你需要明白,每個循環我們得到的集合,並使用迭代器來循環它。 – StackFlowed 2014-09-12 14:16:05

+0

那麼JVM如何知道我的意思是一開始只需要一次獲取集合呢? – James 2014-09-12 14:17:53

+2

取決於你正在討論的循環頭部分,這個部分叫做什麼東西。在經典的循環中,'get(int i = getStartInt(); i ajp15243 2014-09-12 14:18:09

回答

7

認爲它是會被翻譯成類似:

{ 
    Iterator<Attribute> it = factor.getAttributes().iterator(); 
    while (it.hasNext()) { 
     Attribute thisAttribute = it.next(); 
     // loop body here 
    } 
} 

編譯器知道它得到一個可迭代,它可以從它那裏得到了Iterator一次循環中使用它。

原來,Java language specification似乎都同意,它說:

增強的for語句等價於一個基本的申請表格的聲明:

for (I #i = Expression.iterator(); #i.hasNext();) { 
    {VariableModifier} TargetType Identifier = 
     (TargetType) #i.next(); 
    Statement 
} 
+3

Nitpicking:不應該是'Iterator it = factor.getAttributes()。terator();'? – 2014-09-12 14:23:01

+2

JLS參考:http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14.2 – 2014-09-12 14:24:15

+0

@Aeshang:已批准,謝謝。 – 2014-09-12 14:25:12