java.util.ConcurrentModificationException

在这里插入图片描述

增强for底层用了迭代器,会导致遍历的时候修改集合中的元素出现java.util.ConcurrentModificationException,这是因为ArrayList底层维护了一个modCount用于记录list集合修改的次数,每操作一次就会加一,而我们迭代器开始的时候会记录这个值,每次迭代的时候都会比较这个值与目前实际的值是否相同,如果有其他线程或者自身线程在遍历的时候操作了这个list,那么这个modCount就会发生变化,一旦迭代器在迭代的时候发现了这两个值不一样就会报这个异常。

用 CopyOnWriteArrayList<>()可以解决问题,具体是因为CopyOnWriteArrayList<>()底层在迭代的时候,迭代器内部保留了原来的list集合,当迭代的时候i操作这个list集合,它在底层会克隆一个新的和原来一样的list集合,然后操作克隆出来的list集合,再把新的list集合赋值给原来的list集合,而整个过程中迭代器内部的list集合始终都是老的list集合。
在这里插入图片描述
list的线程安全的集合vector也会出现这个异常。

package com.dongmu;

import java.util.ArrayList;
import java.util.Vector;

public class iterable {


    public static void main(String[] args) {
        /*ArrayList<Integer> list = new ArrayList<>();
        list.add(12);
        list.add(13);
        list.add(14);

        for (Integer o : list) {
            System.out.println(o);
            if (o==12){
                list.remove(2);
            }
        }*/


        Vector<Integer> vector = new Vector<>();

        vector.add(12);
        vector.add(13);
        vector.add(14);
        vector.add(15);

        for (Integer integer : vector) {
            System.out.println(integer);
            if (integer==13){
                vector.remove(2);
            }
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北海冥鱼未眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值