当前位置: 首页 > news >正文

好的做蛋糕网站网络销售

好的做蛋糕网站,网络销售,做相册网站推荐,怎样给网站做备案java迭代集合出现并发修改异常(ConcurrentModificationException)的原因以及解决方案 一. 什么时候会出现并发修改异常? 这里先看需求 : 定义一个集合,存储 唐僧,孙悟空,猪八戒,沙僧,遍历集合,如果遍历到猪八戒,往集合中添加一个白龙马 很显然要求我们先创建一个集合并进行…

java迭代集合出现并发修改异常(ConcurrentModificationException)的原因以及解决方案

一. 什么时候会出现并发修改异常?

这里先看需求 : 定义一个集合,存储 唐僧,孙悟空,猪八戒,沙僧,遍历集合,如果遍历到猪八戒,往集合中添加一个白龙马

很显然要求我们先创建一个集合并进行迭代 , 当迭代到猪八戒,的时候插入白龙马

代码实现

public static void main(String[] args) {//需求:定义一个集合,存储 唐僧,孙悟空,猪八戒,沙僧,遍历集合,如果遍历到猪八戒,往集合中添加一个白龙马ArrayList<String> list = new ArrayList<>();list.add("唐僧");list.add("孙悟空");list.add("猪八戒");list.add("沙僧");Iterator<String> iterator = list.iterator();while(iterator.hasNext()){String element = iterator.next();if ("猪八戒".equals(element)){list.add("白龙马");}}System.out.println(list);}

运行后报错

在这里插入图片描述

这里报了一个ConcurrentModificationException 也就是并发修改异常

二. 产生原因

我们来进入源码分析一下

  1. 首先我们来进入 iterator() 方法 , 这里iterator() 是返回了了一个新对象也就是Itr() , 那我们再来看一下Itr()方法

    public Iterator<E> iterator() {return new Itr();}
    
  2. Itr() , 光观察Itr()好像并没有发现异常的原因 , 那我们再看next()方法

    private class Itr implements Iterator<E> {int cursor;       // index of next element to returnint lastRet = -1; // index of last element returned; -1 if no suchint expectedModCount = modCount;// prevent creating a synthetic constructorItr() {}public boolean hasNext() {return cursor != size;}
  3. next() , 这里在运行next()的时候会先调用checkForComodification();方法那我们就先来查看这个方法

    @SuppressWarnings("unchecked")public E next() {checkForComodification();int i = cursor;if (i >= size)throw new NoSuchElementException();Object[] elementData = ArrayList.this.elementData;if (i >= elementData.length)throw new ConcurrentModificationException();cursor = i + 1;return (E) elementData[lastRet = i];}
    
  4. checkForComodification() , 很显然这里判断了modCount 与 expectedModCount是否相等 , 如果不相等则抛出throw new ConcurrentModificationException(); 也就是并发修改异常

    modCount: 实际操作次数
    expectedModCount:预期操作次数

     final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}
    
  5. 那么通过上面的分析我们就知道了产生问题的原因是什么 , 也就是modCount 与 expectedModCount并不相等

    那是什么导致modCount 与 expectedModCount不相等的呢 ? 在代码中我们调用了一个add方法 , 那么add是否就是产生问题的原因

  6. add() , 还是和刚才一样 , 进入add()底层源码我们来找一下原因

    public boolean add(E e) {modCount++;add(e, elementData, size);return true;}
    

    到这里就一目了然了我们在调用add的时候会对modCount++ , 在modCount自增之后 , 我们再调用next()方法就会导致modCount 与 expectedModCount不相等 , 从而抛出异常

三. 解决方法

ArrayList中的方法:ListIterator listIterator()

public class Demo03Iterator {public static void main(String[] args) {//需求:定义一个集合,存储 唐僧,孙悟空,猪八戒,沙僧,遍历集合,如果遍历到猪八戒,往集合中添加一个白龙马ArrayList<String> list = new ArrayList<>();list.add("唐僧");list.add("孙悟空");list.add("猪八戒");list.add("沙僧");//Iterator<String> iterator = list.iterator();ListIterator<String> listIterator = list.listIterator();while(listIterator.hasNext()){String element = listIterator.next();if ("猪八戒".equals(element)){listIterator.add("白龙马");}}System.out.println(list);}
}
http://www.zhongyajixie.com/news/20325.html

相关文章:

  • 有没有专门做建筑造价的私单网站外贸海外推广
  • 源码建站之网站建设长春建站服务
  • 温州网站建设温州网站制作海外营销推广
  • 企业网站的建设目的有什么怎么弄一个网站
  • 工程建设项目网站合肥网络推广服务
  • wordpress文章获取接口长春关键词优化排名
  • 建站之星app今天特大新闻最新消息
  • 陕西电商b2c网站建设公司网站建设开发公司
  • 广东建设工程执业资格注册中心网站google chrome官网下载
  • 网站反链接百度竞价教程
  • wordpress没有安装主题选项卡企业网站seo平台
  • 崇明做网站公司广州网页seo排名
  • 网站开发费的税率是多少采集站seo课程
  • 阿里巴巴可以做网站吗优化营商环境条例解读
  • 微信做网站的公司怎么办网站平台
  • 模板做图 网站bt鹦鹉磁力
  • vs 2008 手机网站开发线上线下推广方案
  • 夏天做啥网站致富网站开发合同
  • 河北省廊坊市三河市最新疫情郑州seo优化服务
  • 公司网站的定义百度seo关键词优化方案
  • 深圳公司形象墙制作抚州seo排名
  • 国外有哪做交互设计网站小红书seo是什么
  • 外贸公司网站怎么设计更好十大培训机构教育培训机构哪家好
  • 珠海知名网站近期网络舆情事件热点分析
  • 日本 女做受视频网站大型网站建设公司
  • 美食网站的设计与制作信息流优化师是什么
  • 西安b2c网站建设网页设计与制作用什么软件
  • 如何进行电商网站设计开发广东网络优化推广
  • 西安那里做网站互联网推广方式有哪些
  • 中国建设银行对公网站首页兰州网络seo公司