为什么在foreach方法上进行并发修改而不在for循环上进行

湿婆
 ArrayList<Integer> targets = new ArrayList<Integer>();
 targets.add(2);
 targets.add(2);

 for (Integer testInt : targets )
 {
       targets.add(1);
 }

我收到并发ModificationException,但具有正常的for循环。我没有任何例外。在正常的forloop中,例如:

for(int i=0;i<target.size();i++)
{
   System.out.println(target.get(i));
   target.add(22); //no exception
   target.remove(2) // no exception 
}
苏雷什·阿塔(Suresh Atta)

ForEach循环不会直接在您的收藏夹上循环。它在后面使用集合的迭代器。您可以在集合实现中看到迭代器。

Arraylist源代码

735 
736     public Iterator<E> More ...iterator() {
737         return new Itr();
738     }


An optimized version of AbstractList.Itr
742 
743     private class More ...Itr implements Iterator<E> {
744         int cursor;       // index of next element to return

你的foreach循环等于

for(Iterator<Integer> i = targets.iterator(); i.hasNext(); ) {
  Integer element = i.next();
  //To do
}

因此,如果您在此处执行任何操作,并且同时修改了集合,则底层的迭代器会造成混乱并引发异常。

JLS

List<? extends Integer> l = ...
for (float i : l) ...

将被翻译成:

for (Iterator<Integer> #i = l.iterator(); #i.hasNext(); ) {
    float #i0 = (Integer)#i.next();
    ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 Nightwatch 上进行同步循环的更好方法是什么?

在API上进行循环

在Python上进行循环

在GPU上进行foreach doparallel

在熊猫上进行比较的循环

为什么在std :: set上进行迭代比在std :: vector上进行迭代慢得多?

在2D数组上进行迭代时,为什么循环顺序会影响性能?

为什么在此循环上进行的迭代未在openpyxl中添加单元格?

为什么在每隔一行而不是每行上进行循环打印?

Infovis不在根节点上进行迭代

为什么不在主线程上进行所有 CPU 密集型操作——使用协程?

为什么用Java在Enum final上进行compareTo?

为什么要在SynchronizedMap或SynchronizedCollections上进行同步?

为什么要在Javascript / Typescript上进行多种导入/导出

为什么我不能在Stream上进行匹配?

为什么instanceof在Android上进行内存分配?

为什么在现有目录上进行挂载?

在Selenium Webdriver项目上进行改进的最佳方法是什么

在iOS上进行UITextField验证的更好方法是什么?

什么是在SerialPort上进行多线程的最佳方法

在不存在的文件上进行循环

使用“ mysite.com”在Chrome多功能工具上进行搜索会跳转到Twitter上进行搜索,为什么?

Java并发-如何在方法参数上进行同步

在EF上进行性能测试时的并发延迟

如何在列表的每个对象上进行并发调用?

如何在某些源上进行并发迭代器?

修改 Tensorflow 代码以在 CPU 上进行预处理并在 GPU 上进行训练

为什么在组件/表单中进行 Angular 验证而不是在域模型上进行一次?

尝试在清单上进行foreach循环时获取System.InvalidOperationException吗?