有几次我遇到过for-each循环会导致问题的情况,包括异常和崩溃,而for(it=list.iterator;it.hasNext();)
可以正常工作。这包括修改集合(我知道不应该为每个集合发生,但不知道为什么)以及我克隆东西的其他情况。不记得任何具体的例子,我只是想着它。
不是for-each只是我指向的第二个循环类型的快捷方式吗?有人可以解释那里的差异究竟是什么?
答案 0 :(得分:5)
问题是在foreach
循环中remove
元素。使用迭代器时,您使用remove
方法。使用foreach
时,您无法直接访问底层迭代器,也无法调用其remove
方法。
否则它是一样的。 Foreach不会导致更多问题或崩溃。你无法删除元素。
答案 1 :(得分:3)
for-each
只是java 1.5中引入的一种语法糖。它使用从场景后面的Iterable
获得的迭代器。
您提到的唯一合理差异是迭代期间的集合修改。是的,这是不可能的。使用Iterator
在迭代期间无法修改集合。该尝试导致ConcurrentModificationException
。这与两种情况(迭代器的显式和隐式用法)相关。
唯一的例外是Iterator.remove()
(支持时)。在这种情况下,迭代器不会抛出异常。
原因很清楚。 Iterator无法迭代迭代期间正在更改的集合,除非它知道更改并可以重新排列自己。当您使用Iterator.remove()
时会发生这种情况。