ConcurrentModificationException并发修改异常

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013317445/article/details/81951988

迭代器在遍历集合时,是不能通过集合修改元素的。
因为迭代器是依赖于集合而存在的,而集合的改变迭代器却并不知道。
看下面这个代码:

//该代码实现的功能:判断有没有"a",如果有,就在该元素"a"之后添加一个"hahaha"元素
//报错:并发修改异常
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListIteratorDemo {
    public static void main(String[] args){
        List l= new ArrayList();

        l.add("just");
        l.add("a");
        l.add("sec");

        Iterator it= l.iterator();
        while(it.hasNext()){
            String s= (String)it.next();  //java.util.ConcurrentModificationException
            if(s.equals("a")){              //因为一边对该集合l使用着迭代器,同时一边通过集合修改着元素。迭代器是依赖于集合而存在的,而集合的改变迭代器却并不知道。所以出错了。
                l.add(l.indexOf("a")+1,"hahaha");
            }
        }
        System.out.println(l);
        }
  }

解决:
方式一:迭代器迭代元素,迭代器修改元素。

 //解决方式二:列表迭代器遍历,列表迭代器修改元素
        ListIterator lit= l.listIterator();
        while(lit.hasNext()){
            String s= (String)lit.next();
            if(s.equals("a")){
                lit.add("hahaha"); //列表迭代器的add()方法会添加在next()之后,即当前s之后
            }
        }
        System.out.println(l);//[just, a, hahaha, sec]

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

//集合遍历,集合修改
        for(int i=0; i<l.size();++i){
            String s= (String)l.get(i);//好习惯:得到每一个元素之后先转回原型。避免后面出错
            if("a".equals(s)){
                l.add(i+1, "hahaha");
            }
        }
        System.out.println(l);
    }

猜你喜欢

转载自blog.csdn.net/u013317445/article/details/81951988
今日推荐