0

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

不是 for-each 只是我指出的第二种循环类型的快捷方式吗?有人可以准确解释那里有什么区别吗?

4

2 回答 2

5

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

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

于 2012-05-03T14:31:51.087 回答
3

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

您提到的唯一一个合理的区别是迭代期间的集合修改。是的,这是不可能的。不能在迭代期间使用 修改集合Iterator。企图引起ConcurrentModificationException。这与两种情况都相关(迭代器的显式和隐式使用)。

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

原因很清楚。迭代器无法迭代在迭代期间正在更改的集合,除非它知道更改并可以重新安排自己。这就是您使用Iterator.remove().

于 2012-05-03T14:34:54.143 回答