什么!1024你就给我看这 ConcurrentModificationException

前言

​ 今天是1024节日,首先和大家说声节日快乐哈,也好久没更新过博客了,从去年停更以来这段时间确实经历了很多事情,也就是我从一个学生慢慢转变为一个职场人的过程,以后有机会的话可以和大家分享这段时间的经历。

正文

回到正题,今天主要和大家分享一个我之前在工作中遇到的一个异常。

java.util.ConcurrentModificationException

emm…

大家是不觉得稍微有点陌生,没关系,上代码,大家来看看这个异常是如何产生的。

		List<String> list = new ArrayList<>();
        list.add("abc");
        list.add("abcd");
        list.add("abcde");
        list.add("abcdef");
        //需求:删除集合中字符串长度等于4的元素
        for (String str : list) {
            if (str.length() == 4) {
                list.remove(str);
            }
        }

简单和大家说下原因吧:我们在对集合进行foreach循环的时候,会对modCount和expectedModCount两个值进行比较。因为在遍历集合的过程中进行了删除元素的操作,导致两个值不相等,所以报了这个异常。

这个的话大家去看下ArrayList源码就很清晰了,喏,下面就为你们准备好了源码。

多贴心。。。。

	public void forEach(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        final int expectedModCount = modCount;
        @SuppressWarnings("unchecked")
        final E[] elementData = (E[]) this.elementData;
        final int size = this.size;
        for (int i=0; modCount == expectedModCount && i < size; i++) {
            action.accept(elementData[i]);
        }
        if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }
    }

好了,原因我们也了解过了,接下来就交大家如何去解决,毕竟需求还是在的嘛。

这里我就讲一个最简单的方法吧!

jdk在1.8为我们提供了一个removeIf()方法,专用于遍历集合过程中删除特定的元素,具体操作如下。具体jdk是如何解决的,大家也可以去看一下源码,这里我就不过多探讨了。

		List<String> list = new ArrayList<>();
        list.add("abc");
        list.add("abcd");
        list.add("abcde");
        list.add("abcdef");
        //需求:删除集合中字符串长度等于4的元素
        list.removeIf(i -> i.length()==4);

总结

怎么说呢,比较水,哈哈,但也算是自己的一个小心得吧!

祝大家节日快乐,我们下期见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值