ConcurrentModificationException:并发修改异常

需求:我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Demo {
  public static void main(String[] args) {

    List<String> list = new ArrayList<String>();

    list.add("hello");
    list.add("world");
    list.add("java");

    Iterator<String> it = list.iterator();
    while (it.hasNext()) {
      String s = it.next();
      if ("world".equals(s)) {
        list.add("javaee");
      }
    }

  System.out.println("list:" + list);
  }
}

上面的代码在运行时会出现ConcurrentModificationException:并发修改异常

产生的原因:

  迭代器是依赖与集合而存在的,在判断成功后,集合中心添加了元素,而迭代器不知道,所以就报错了,这个错误就叫并发修改异常。

  其实这个问题描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。

那么当遇到这种异常应该如何解决呢?

  方式一:我们可以使用迭代器迭代元素,迭代器添加元素。

      此时我们使用的是List集合特有的迭代器ListIterator listIterator()列表迭代器。

      该迭代器继承了Iterator迭代器,所以,可以直接使用hasNext()和next()方法。

      另外ListIterator的void add(Object obj)方法可以添加元素。

      注意:使用列表迭代器ListIterator添加的元素是跟在刚才迭代的元素的后面的。

      那么使用列表迭代器完成上面的需求的代码体现为:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Demo {
  public static void main(String[] args) {

    List<String> list = new ArrayList<String>();

    list.add("hello");
    list.add("world");
    list.add("java");   

    ListIterator<String> lit = list.listIterator();
    while (lit.hasNext()) {
      String s =  lit.next();
      if ("world".equals(s)) {
      lit.add("javaee");
      }
    }

  System.out.println("list:" + list);
  }
}

  方式二:使用集合遍历元素,集合修改元素(使用普通for)

      使用List集合的size()和get()方法来遍历集合

      注意使用普通for遍历和修改集合元素,元素都是在最后添加的

      那么使用普通for完成上面的需求的代码体现为:

import java.util.ArrayList;
import java.util.List;

public class Demo {
  public static void main(String[] args) {

    List<String> list = new ArrayList<String>();

    list.add("hello");
    list.add("world");
    list.add("java");   

   

    for (int x = 0; x < list.size(); x++) {
      String s = list.get(x);
      if ("world".equals(s)) {
      list.add("javaee");
      }
    }

  System.out.println("list:" + list);
  }
}

时间: 2024-10-18 02:10:24

ConcurrentModificationException:并发修改异常的相关文章

ConcurrentModificationException并发修改异常

A:ConcurrentModificationException出现: /*Iterator it = list.iterator(); //获取迭代器 while(it.hasNext()) { //判断集合中是否有元素 String str = (String)it.next(); //向下转型 if("world".equals(str)) { list.add("javaee"); //遍历的同时在增加元素,并发修改ConcurrentModificati

List集合遍历时修改元素出现并发修改异常总结

什么是并发修改异常: 当我们在遍历实现了collection接口与iterator接口的集合时(List.Set.Map), 我们可以通过遍历索引也可以通过迭代器进行遍历.在我们使用迭代器进行遍历集合的时候,会获取到当前集合的迭代对象.在里面有封装了迭代器的remove方法与集合自带的remove方法,如果我们调用迭代器对象的remove方法是没问题的,但是当我们调用集合自带的remove方法时,就会产生ConcurrentModificationException 并发修改异常.也就是说,当我

集合框架之——迭代器并发修改异常ConcurrentModificationException

问题: 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. 使用普通迭代器出现的异常: ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常. 产生的原因: 迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常. 其实这个问题描述的是:普通迭代器遍历元素的时候,

大杂烩 -- Iterator 并发修改异常ConcurrentModificationException

基础大杂烩 -- 目录 大杂烩 -- Java中Iterator的fast-fail分析 大杂烩 -- Iterator 和 Iterable 区别和联系 问题: 在集合中,判断里面有没有"Hello"这个元素,如果有,我就添加一个"It's me"元素. 使用普通迭代器出现的异常: ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常. 产生的原因: 迭代器是依赖于集合而存在的,在判断成功后,集

ConcurrentModificationException 集合并发修改异常 解决

import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /** * 问题? * 有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. * * ConcurrentModificationException: 但方法监测到对象的并发修改,但不允许这种修改时,抛出此异常. * 产生的原因: *

ConcurrentModificationException(并发修改异常)的解决

[异常解释] ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常.[产生的原因] 迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常. 简单描述就是:迭代器遍历元素的时候,是不能通过集合的方法修改元素的.[如何解决] A:迭代器遍历元素,用迭代器的方法修改集合元素 B:集合遍历元素,集合修改元素(普通for) [代码实现] 1 package com.hxl;

理解和解决Java并发修改异常ConcurrentModificationException(转载)

原文地址:https://www.jianshu.com/p/f3f6b12330c1 理解和解决Java并发修改异常ConcurrentModificationException 不知读者在Java开发的过程中有没有遇到类似的异常信息 Exception in thread "main" java.util.ConcurrentModificationException, 下面小编简单介绍异常原因以及这种异常的改进方法,内容很简单,有什么问题还望指正. 假设我们要实现这样一个例子:

并发修改异常(ConcurrentModificationException)

并发修改异常(ConcurrentModificationException) 这个异常,使用集合的时候应该很常见,这个异常产生的原因是因为java中不允许直接修改集合的结构. 先贴上个有趣的例子,给你们看看: package com.xiongda; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Confirm { public static void mai

java 15 - 8 集合框架(并发修改异常的产生原因以及解决方案)

问题?   我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现.  面试题: ConcurrentModificationException: 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常.  产生的原因:  迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,迭代器的内容不发生改变.所以就报错了,这个错叫并发修改异常.  其实这个问题描述的是:迭代器