for-each和for循环

时间:2012-05-03 14:29:07

标签: java loops

有几次我遇到过for-each循环会导致问题的情况,包括异常和崩溃,而for(it=list.iterator;it.hasNext();)可以正常工作。这包括修改集合(我知道不应该为每个集合发生,但不知道为什么)以及我克隆东西的其他情况。不记得任何具体的例子,我只是想着它。

不是for-each只是我指向的第二个循环类型的快捷方式吗?有人可以解释那里的差异究竟是什么?

2 个答案:

答案 0 :(得分:5)

问题是在foreach循环中remove元素。使用迭代器时,您使用remove方法。使用foreach时,您无法直接访问底层迭代器,也无法调用其remove方法。

否则它是一样的。 Foreach不会导致更多问题或崩溃。你无法删除元素。

答案 1 :(得分:3)

for-each只是java 1.5中引入的一种语法糖。它使用从场景后面的Iterable获得的迭代器。

您提到的唯一合理差异是迭代期间的集合修改。是的,这是不可能的。使用Iterator在迭代期间无法修改集合。该尝试导致ConcurrentModificationException。这与两种情况(迭代器的显式和隐式用法)相关。

唯一的例外是Iterator.remove()(支持时)。在这种情况下,迭代器不会抛出异常。

原因很清楚。 Iterator无法迭代迭代期间正在更改的集合,除非它知道更改并可以重新排列自己。当您使用Iterator.remove()时会发生这种情况。