2010-03-25 157 views

回答

10

爲什麼在java中引入這個循環?

這只是爲了緩解對泛型集合和數組的循環。取而代之的

for (int i = 0; i < strings.length; i++) { 
    String string = strings[i]; 
    // ... 
} 

你可以做

for (String string : strings) { 
    // ... 
} 

這使得代碼更易讀,更好維護。

它是一個Java的創造?

不,它早在Java之前就存在於其他語言中。 Java在實現它時相對較晚。

它的用途是什麼?

查看第一個答案。

要了解更多信息,請查看Sun guide on the subject

更新:這並不意味着它會使其他類型的循環變得多餘。 for循環使用索引仍然有用,如果你想維護一個循環計數器用於其他目的而不是按索引獲取項目。如果您想在循環中刪除或更改集合本身的元素,則使用迭代器的for循環仍然很有用。

3

請參閱Foreach

對於每一個(或的foreach)是在 集合遍歷項計算機 語言成語。 Foreach通常用 代替語句標準。 不像其他的循環結構, 然而,foreach循環1通常 保持無明顯的計數器:他們 本質上說,「這樣做是爲了在這個集合一切 」,而不是「做X 倍」。這避免了潛在的 逐個錯誤,並使代碼 更易於閱讀。在面向對象的 語言中,迭代器(即使是隱式的)通常被用作遍歷的手段 。

幾種語言,包括Python, 只有一個foreach循環,需要 顯式計數才能實現 行爲的「標準」。

而具體上的Java的部分:

一個foreach構建體在JDK 5.0中引入的。官方消息來源爲該構造使用了多個名稱。它被稱爲「For循環增強」,「For-Each循環」和「foreach語句」。

10

它掩蓋了迭代器的使用,它使用起來沉重笨拙。有很多很多的實例,你只是想迭代一個集合而沒有處理它的索引。 java的foreach結構使這成爲可能。

+4

額外的重點應放在對事實口罩迭代器。諸如從列表中移除項目可以安全地用迭代器完成的操作在foreach循環中無法安全地完成。 – TwentyMiles 2010-03-25 18:04:42

2

這真的只是Java模仿功能性構造的時間更長,it's called map。實現它的原因是,製作一個循環只是簡單地對容器的每個元素執行一個操作,而不考慮其索引。 Java的for(element : container) { doSomethingWith(element); }語法正是這樣做比替代方案,它們要麼做一個for循環與索引

for(int i=0; i<container.size(); ++i) { doSomethingWith(container.at(i)); } 

哪個更長,並創建一個不必要的指標變量,或者做一個循環清潔的方式迭代器

Iterator it = container.iterator(); 
while(it.hasNext()) { doSomethingWith(it.next()); } 

這也是更長。這個循環基本上是for(:) {}循環被編譯成的東西,儘管可能會有一些細微的差別(我沒有真正看到字節碼)。

+0

+1小寫錯別字;如果不正確,則還原。另見http://java.sun.com/javase/6/docs/api/java/lang/Iterable.html – trashgod 2010-03-25 20:19:59

0

這是平淡的「語法糖」

不認爲有任何效率的提高。

Java社區希望有點現代化的語言,C#和Ruby的競爭..