ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用Iterator对List集合进行增加或者删除操作时报异常的分析

2022-05-29 03:31:07  阅读:215  来源: 互联网

标签:java 时报 Iterator ArrayList List next util add 迭代


一、问题

使用Iterator在对List集合进行遍历集合时,如果只是遍历而不进行增加、删除操作时,可以正常运行吗,但是如果我们在使用迭代器对List集合进行插入或者删除时,就会出现Exception in thread "main" java.util.ConcurrentModificationException这个异常。(调用了next方法)

代码:
package com.example.demo.domain;

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

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

        List<String> list = new ArrayList<String>() {{
            add("111");
            add("java");
        }};

        Iterator<String> iterator = list.iterator();

        while (iterator.hasNext()) {
            String next = iterator.next();
            if("java".equals(next)){
                list.add("666");
            }
        }

        System.out.println(list);
    }
}

错误:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
    at java.util.ArrayList$Itr.next(ArrayList.java:859)
    at com.example.demo.domain.Demo2.main(Demo2.java:18)

 

 由此我们可以知道这个错误时在代码的 18行,也就是下面那行:

String next = iterator.next();

二、原因分析

前提:先了解一个AbstractList中,有一个全局变量madCount

在AbstractList中,有一个全局变量madCount,记录了结构性改变的次数。结构性改变指的是那些修改了列表大小的操作,在迭代过程中可能会造成错误的结果。

madCount交由迭代器(Iterator)和列表迭代器(ListIterator)使用,当进行next()、remove()、previous()、set()、add()等操作时,如果madCount的值意外改变,

那么迭代器或者列表迭代器就会抛出ConcurrentModificationException异常。


 

 

 

 

 

 

 

所以我们每次 add 或者 remove 操作时,这个modCount都会自增一次。

 

获取迭代器是如何操作的?

 

 

 

三、总结

  当我们使用ArrayList做 add 或者 remove 操作时,都会改变 madCount (记录了结构性改变的次数) 的值,而在我们获取迭代器时,其实是获取了ArrayList内部类的迭代器,

  然后我们使用next()这个方法时都会调用checkForComodification()方法,可以看出在这个方法中抛出了异常,那么抛出异常的条件是因为modCount != expectedModCount

  这个条件,modCount是指记录了结构性改变的次数,expectedModCount代表期望遍历次数,当我们在使用迭代器进行遍历并插入或者删除时,modCount就会改变,从而导

  致modCount != expectedModCount,从而抛出异常。

 

标签:java,时报,Iterator,ArrayList,List,next,util,add,迭代
来源: https://www.cnblogs.com/xiejn/p/16322753.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有