重学java之ArrayList modCount

看到ArrayList,这入门级基础太简单,相信绝大多数人都不屑一顾(这东西太简单)

但是我要说的是,里面有些细节还是要注意的。里面数据结构也不多说了,相信大家都知道。先来上一段代码

public static void main(String[] args) {
        List<String> data = new ArrayList<>();
        int i=10;
        while(i-->0){
            data.add(String.valueOf(i));
        }
        for(String a : data){
            if(a.equalsIgnoreCase("1")){
                data.remove(a);
            }
            System.out.println(a);
        }
    }
这段代码能否正常运行?

肯定有说可以,也有说不可以的,那如果可以的话,打印的是什么?

也不卖关子了,其实这段代码正常运行且打印987654321,可是,为啥0没打印,回老家了吗?

这其实都是modCount和ArrayList.Itr做的怪

for编译后是ArrayList.Iterator()方法,而Iterator其实就是new一个ArrayList.Itr,此时会把modCount做一个副本丢到Itr的ExpectedModCount。当对List做add或者remove时都会对modCount+1,每次next()都会先校验modCount!=ExpectedModCount,然后抛异常。

此时肯定有人会说,对呀所以这段代码肯定运行失败。等等,我还没说完咧。知道modCount作用的都知道这段代码的问题,但是还有个细节,那就是hasNext(),这里只有一句cursor != size,但是,这个size可以ArrayList的size哦,当进行remove后size-1而此时cursor游标也到size-1的位置,因此直接返回了。

好了,上面代码说完,再来看一段

public static void main(String[] args) {
        List<String> data = new ArrayList<>();
        int i=10;
        while(i-->0){
            data.add(String.valueOf(i));
        }
        data.forEach(a ->{
            if(a.equalsIgnoreCase("1")){
                data.remove(a);
            }
            System.out.println(a);
        });
    }

 问都不用问,上面正常,这里80%都能猜到异常了,直接说原因吧

ArrayList重写了Iterable的forEach方法,直接拿到list的数据源elementData[],同时备份modCount到expectedModCount ,循环时也会modCount和expectedModCount是否相同,结束循环后再次比较count值,不等就抛异常

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值