Java Fail-fast

    快速失败是当迭代器遍历集合的时候,如果集合的结构发生了改变(使用集合的添加或删除,迭代器的添加和删除不会报异常),迭代器就会抛出ConcurrentModificationException异常。

 

for (int i = 0; i < 3; i++) {
                mStringList.add(String.valueOf(i));
                Log.d(TAG, "add" + i);
            }
            Iterator<String> iterable = mStringList.listIterator();
            while (iterable.hasNext()) {
                String str = iterable.next();
                if (str.equals("1")) {
                    // ConcurrentModificationException 异常
                    mStringList.remove(str);
                    // 不会报异常
                    iterable.remove();
                }
            }

 

    为什么会报这个异常呢?查看ArrayList的源码就很清晰了。在创建迭代器的时候,迭代器会使用一个变量expectedModCount来保存列表的modCount。这个modCount是什么呢?modCount其实就是这个列表在结构上被修改的次数 。以后在使用迭代器的next,previous等方法的时候,就会根据expectedModCount是否等于modCount来判断列表的结构是否已经发生了改变。如果不相等,就抛出ConcurrentModificationException异常。

    需要注意的是,forEach遍历的使用其实迭代器的方法,它也会去判断expectedModCount是否等于modCount来判断列表的结构是否已经发生了改变来抛出异常。

    查看ArrayList集合官方的解释,快速失败的为了应对并发的修改(多线程场景),迭代器会快速干净的失败而不是冒着不确定的风险。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值