迭代器遍历元素并给集合中添加元素时报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);
  }
}


目录
相关文章
|
7月前
|
缓存 边缘计算 监控
89_批量推理:异步API调用
在当今数据密集型应用和大模型部署的时代,批量推理已成为提升系统性能和资源利用率的关键技术。随着深度学习模型规模的不断扩大和应用场景的日益复杂,如何高效地处理大量推理请求成为技术团队面临的重要挑战。传统的同步API调用方式在面对高并发、大规模数据处理时,往往会遇到响应延迟高、资源利用不充分等问题。异步API调用作为一种更高效的处理模式,通过非阻塞操作和并发处理能力,为批量推理场景提供了理想的解决方案。
586 0
|
JavaScript 前端开发 网络架构
vue 路由器history和hash工作模式
vue 路由器history和hash工作模式
|
机器学习/深度学习 人工智能 城市大脑
阿里云 ET
阿里云 ET自制脑图, 由阿里云科学家团队研发的超级人工智能ET,是杭州城市大脑背后的人工智能中枢,也是阿里巴巴集团董事局主席马云眼中的下一代 CEO。阿里云 ET 拥有全球领先的人工智能技术。
1255 0
阿里云 ET
|
存储 机器学习/深度学习 人工智能
《量子AI:突破量子比特稳定性与容错性的关键瓶颈》
量子计算的发展面临量子比特稳定性和容错性的关键挑战。量子纠错技术如表面码、Steane七量子比特颜色代码等,通过编码和解码提高可靠性。硬件设计选择超导或离子阱量子比特,结合低噪声器件减少干扰。量子噪声抑制技术优化环境,降低噪声影响。拓扑量子计算利用多体系统的拓扑性质实现天然容错。量子算法优化和AI技术助力,进一步提升抗干扰能力。尽管取得进展,但要实现大规模应用仍需克服诸多挑战。
368 13
|
Java
Java Exception打印及输出到日志
有时候如果打印出异常的错误,并记录下来,这里记录一下
1152 5
|
JavaScript 数据可视化
JS如何优雅的实现模块自动滚动展示
【8月更文挑战第22天】JS如何优雅的实现模块自动滚动展示
467 1
JS如何优雅的实现模块自动滚动展示
|
JavaScript API
【Vue】Cannot set reactive property on undefined,null,or primitive value:undefined
【Vue】Cannot set reactive property on undefined,null,or primitive value:undefined
799 0
|
开发工具 数据安全/隐私保护 C++
windows openssl安装和基本使用(代码演示)
本文主要讲到了openssl的基本使用方法,开发环境为windows,开发工具为VS2019.本文主要是说明openssl如何使用,不介绍任何理论知识,如果有不懂的,请自行百度。个人建议下一个everything查询工具,真的很好用,比window自带的查询快了很多,可以查询自己想要的文件
1282 0
windows openssl安装和基本使用(代码演示)
|
C++
C++ 默认参数与引用传递:语法、用法及示例
C++ 允许函数参数具有默认值,简化调用。例如,`void myFunction(string country = &quot;Norway&quot;)` 中`country`默认为&quot;Norway&quot;。默认参数仅适用于函数参数,不包括返回值。引用传递是另一种传递方式,函数直接访问变量内存,允许修改原值,提高效率。`void swapNums(int &x, int &y)` 中`x`和`y`为引用参数。了解这些特性可提升代码可读性和性能。
447 0
|
存储 XML 数据格式
流程建模艺术:使用Activiti设计流程
流程建模艺术:使用Activiti设计流程
430 0

热门文章

最新文章