当前位置: 首页 > 知识库问答 >
问题:

为什么在for循环中移除元素时不总是抛出ConcurentModificationException[重复]

柴寂离
2023-03-14
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
for (int i = 0; i < list.size(); i++) {
Integer integer = list.get(i);
if (integer.equals(1)) {
    list.remove(integer);
  }
}
System.out.println(list);
for (Integer integer : list) {
  if (integer.equals(1)) {
    list.remove(integer);
  }
}
System.out.println(list);
for (Integer integer : list) {
  if (integer.equals(2)) {
    list.remove(integer);
  }
}
System.out.println(list);

我曾经认为移除for-loop中的元素总是会导致ConcurrentModificationException,但我可能错了。你们能告诉我是什么造成了这里的差异吗。我在Corretto11上运行代码。

共有1个答案

晏弘雅
2023-03-14

这里的要点是,当您访问(!)时会引发ConcurrentModificationException下一个元素通过迭代器,而不是在检查另一个元素的存在时。

在第二个片段中,删除第一个元素,然后还有两个元素。在下一次迭代中,会注意到有更多的元素将被访问,并且随着expectedModCount的更改,异常将被抛出。

然而,在第三个示例中,由于减小了大小,您将在第二次迭代之后到达末尾,并且不会发生进一步的访问,因此不会引发异常。

 类似资料:
  • 在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接

  • 问题内容: 在Java 9中,在Set接口上引入了称为of()的新静态工厂方法,该方法接受多个元素,甚至是元素数组。 我想将一个列表变成一个集合,以删除集合中的所有重复条目,这可以使用以下方法完成(在Java 9之前): 但是我认为使用这种新的Java 9静态工厂方法很酷: 其中是先前定义的字符串列表。 但是,可惜的是,当元素重复时,java抛出了一个,该方法的Javadoc中也对此做了说明。为什

  • 我有这个代码: outlets是传递给方法的ArrayList;riverBasin是int(int[]riverBasin)的2D“矩阵”; 从ArrayList outlets中删除“项”会生成错误: 但我并不完全理解。然而,我怀疑我弄坏了迭代器。对的那么我如何删除ArrayList中不需要的元素呢。 提前感谢您的帮助, 里卡多

  • 问题内容: 我有一个整数列表,我正在运行-loop来发现两个元素的总和是否等于另一个变量。所以,如果是等于和我有一个整数列表: ,那么函数应该打印所有数字的不同组合,。 我感觉自己快到了,但是当我使用该功能时,列表中发生了一些奇怪的事情。下面的代码用于显示所有需要计算的数字组合,但是列表中的所有其他元素都被跳过。 这是输出: 请注意如何,,,和被跳过。我正在使用第二个-loop不会使用原始值,然后

  • 在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接

  • 所以我这里有一个程序,它只是简单地模仿跳棋(但不是跳,而是一个棋子简单地“吃掉”另一个棋子)。我有一个简单的类,它实现了一个“checkers”类对象,并创建了一个名为“chips”的int数组变量。还有一个“while”语句,它在chip[0]和chips[1]整数大于0时创建了一个循环。看起来是这样的: Checkers类中的count方法如下所示: 板是8 x 8(这就是board.leng