2012-05-03 97 views
0

有幾次我遇到過for-each循環會導致問題的情況,包括異常和崩潰,而for(it=list.iterator;it.hasNext();)工作時沒有任何問題。這包括修改集合(我知道不應該爲每個集合而發生,但不知道爲什麼)以及其他情況下克隆的東西。不能回想任何具體的例子atm我只是想到了它。for-each和for loops

是不是for-每個只是我指出的第二個循環類型的快捷方式?有人能解釋一下究竟有什麼區別嗎?

+0

http://stackoverflow.com/questions/7332190/using-iterator-interface-or-for-each-statement-in-java/7332496#7332496 –

回答

3

for-each只是java 1.5中引入的一個語法糖。它使用在場景後面從Iterable獲得的迭代器。

你提到的唯一一個合理的區別是迭代過程中的集合修改。是的,這是不可能的。使用Iterator在迭代過程中不能修改集合。嘗試導致ConcurrentModificationException。這對兩種情況都是相關的(迭代器的顯式和隱式使用)。

唯一的例外是使用Iterator.remove()(支持時)。在這種情況下,迭代器不會拋出異常。

原因很明顯。迭代器不能迭代在迭代期間被更改的集合,除非它知道變化並且可以重新排列它自己。這是當您使用Iterator.remove()時發生的情況。

5

問題是當你在foreach循環你remove一個元素。使用迭代器時,您有一個remove方法。在使用foreach時,您無法直接訪問基礎迭代器,也無法調用其remove方法。

否則它是一樣的。 Foreach不會導致更多的問題或崩潰。你不能刪除一個元素。