迭代器遍历元素并给集合中添加元素时报ConcurrentModificationException

简介: 迭代器遍历元素并给集合中添加元素时报ConcurrentModificationException

需求:


给List集合中存储一些字符串元素,判断这个集合如果有"world"元素,给集合中添加"javaee"元素


我们分析:

首先先创建一个集合对象,给里面添加元素 存在"world"元素使用迭代器遍历

list集合,通过next()获取每一个元素 String s = (String)(it.next()) ;判断如果当前s中存在"world"元素,集合添加元素 输出list集合对象

public class ListTest {
  public static void main(String[] args) {
    //创建一个集合对象
    List list = new ArrayList() ;
    //给集合中添加一些字符串元素
    list.add("hello") ;
    list.add("world") ;
    list.add("java") ;
    list.add("php") ;
    //使用迭代器遍历元素
    Iterator it = list.iterator() ;
      while(it.hasNext()) {
        //获取下一个元素
        String s = (String)(it.next()) ;   
        //判断如果当前字符串有world元素,给集合中新添加一个元素
        if("world".equals(s)) {
          //给集合中添加元素
          list.add("javaee") ;
        }
      }
    System.out.println("list:"+list);
  }
}
 然后运行报错: 
 java.util.ConcurrentModificationException:并发修改异常
 我们在使用迭代器遍历元素时,不能使用集合添加元素(迭代器遍历的元素,给集合中添加元素,迭代器不知道集合新添加的元素)
 并发:某个时间点,多个对象都在使用同一个数据.


如何解决当前并发修改异常


1)如果使用迭代器遍历元素,就使用迭代器添加元素  (只能使用列表迭代器,在获取下一个
元素前插入元素)
public class ListTest {
  public static void main(String[] args) {
    //创建一个集合对象
    List list = new ArrayList() ;
    //给集合中添加一些字符串元素
    list.add("hello") ;
    list.add("world") ;
    list.add("java") ;
    list.add("php") ;
    //使用迭代器遍历元素
    ListIterator lit = list.listIterator() ;
    while(lit.hasNext()) {
      String s = (String)(lit.next()) ;
      //判断是否存在“world”元素
      if("world".equals(s)){
        //使用迭代器添加元素
        lit.add("javaee");
      }
    }
    System.out.println("list:"+list);
  }
}
2)如果使用集合遍历元素:普通for循环(size()和get(int index))相结合,使用集合添加
元素(在末尾添加元素)
public class ListTest {
  public static void main(String[] args) {
    //创建一个集合对象
    List list = new ArrayList() ;
    //给集合中添加一些字符串元素
    list.add("hello") ;
    list.add("world") ;
    list.add("java") ;
    list.add("php") ;
      for(int x = 0 ; x < list.size() ; x ++) {
      //获取并判断
      String s = (String)(list.get(x)) ;
      if("world".equals(s)) { //所有集合都重写了equals方法,默认内容是否相同
        //使用集合添加元素
        list.add("javaee") ;
      }
    }
    System.out.println("list:"+list);
  }
}


目录
相关文章
|
1月前
|
开发者
迭代器(Iterator)遍历的两种方法(for和while)
迭代器(Iterator)遍历的两种方法(for和while)
|
11月前
|
Java
ArrayList 循环遍历并删除元素的常见陷阱
ArrayList 循环遍历并删除元素的常见陷阱
74 0
逆序遍历List集合
逆序遍历List集合
46 0
|
自然语言处理 Java
遍历list时删除元素发生了什么?
遍历list时删除元素发生了什么?
101 0
ArrayList 三种遍历方法(for循环+下标、foreach、使用迭代器)
ArrayList 三种遍历方法(for循环+下标、foreach、使用迭代器)
|
安全 Java 容器
如何在遍历的同时删除ArrayList 中的元素
如何在遍历的同时删除ArrayList 中的元素
366 0
|
索引 容器
集合之迭代器
集合之迭代器
210 0
集合之迭代器
【Groovy】集合遍历 ( 使用 for 循环遍历集合 | 使用集合的 each 方法遍历集合 | 集合的 each 方法返回值分析 )
【Groovy】集合遍历 ( 使用 for 循环遍历集合 | 使用集合的 each 方法遍历集合 | 集合的 each 方法返回值分析 )
1308 0
【Groovy】集合遍历 ( 使用 for 循环遍历集合 | 使用集合的 each 方法遍历集合 | 集合的 each 方法返回值分析 )
遍历小结
1.遍历数组下标 2.遍历数组值 3.遍历下标与值 4.forEach()用法