2013-07-05 58 views
-2

考慮以下示例的ArrayList<String> listfor-each循環與遍歷列表的循環方式不同嗎?

我很想知道for-each循環是如何在「幕後」工作的。傳統的for循環的數字索引訪問列表的元素,就像這樣:

for(int i = 0; i < list.size(); i++) 

是否換每個語法訪問列表的基本方式不同的元素?或者它只是一個同樣的事情的簡寫版本?

例如,在下面的循環中,是否隱式創建了一個變量(如上面的i)?如果有,它是否有名字?如果不是,列表的元素是否仍然按順序訪問?

for(String item : list) 
+0

它採用標準的迭代器。它不知道迭代List可以用get()來完成。它只使用數組的索引查找。 –

回答

2

增強for循環使用迭代器作爲循環的基本實現。

JLS - Section # 14.14

的含義增強的for語句由翻譯給到 for語句一個基本的,如下:

  • 如果表達式的類型是一個亞型Iterable,那麼翻譯如下。

    如果對於某些類型參數X,表達式的類型是Iterable<X>的子類型,那麼讓我爲java.util.Iterator<X>; 否則,讓我成爲原始類型java.util.Iterator

增強for語句相當於一個基本爲形式的語句:

for (I #i = Expression.iterator(); #i.hasNext();) { 
    VariableModifiersopt TargetType Identifier = 
     (TargetType) #i.next(); 
    Statement 
} 
1

它採用iterator幕後,而不是傳統的指數

for(String name: names){ 
} 

相當於

for (Iterator<String> i = names.iterator(); i.hasNext();){ 

} 

請參見

1

增強型for-loop是基於迭代器訪問列表的基礎,而不是基於索引的。它的工作原理是這樣的:

Iterator<String> itr = list.iterator(); 
while(itr.hasNext()) { 
    String item = itr.next(): 
    //your code 
}