Foreach 针对 for(int...) 循环 - 为什么在删除元素时 foreach 会引发异常?

aug*_*123 5 java foreach for-loop

我想知道为什么我不能从列表中删除元素,当我使用 foreach 循环迭代它时:

List<Object> objects = new ArrayList<Object>();
Object one = new Object();
Object two = new Object();
Object three = new Object(); 

objects.add(one);
objects.add(two);
objects.add(three);
Run Code Online (Sandbox Code Playgroud)

然后删除元素,如:

foreach(Object o : objects){
  objects.remove(three); //I know that o is my current object
}
Run Code Online (Sandbox Code Playgroud)

似乎 foreach 循环不允许删除循环队列中“静止”的对象。我对么?

为什么 for-int-loop 不关心这个?在这个循环中,我可以轻松删除仍在循环中的对象。

谢谢

Ste*_*eve 4

嗯,最初这个问题被标记为 C#,现在被删除了。然而....

for/循环不关心您是否从集合中删除元素是不正确的。如果您在前进时删除元素,则在删除的元素之后索引元素将会出现问题,因为索引不再与下一个元素匹配。仅当以相反顺序循环(从最后一个元素到第一个元素)时,才能避免 for/loop 出现问题

foreach 在内部也遇到同样的问题。枚举器维护Current元素的位置,如果删除元素然后前进到该Next位置,则Current索引器不会指向删除后的元素,而是指向删除后第二个位置的元素。

例如:

假设“birds”、“animals”和“fishes”的字符串集合

  • 在foreach开始时,内部Current为0(指向“birds”)
  • 您删除了“birds”,因此“animals”位于索引 0(Current 仍指向该位置)
  • 您前进到下一个元素(当前=1,指向“fishes”)
  • 没有例外,下一个前进将退出循环。

foreach 的设计不允许出现这种情况。