我是靠谱客的博主 坦率小松鼠,最近开发中收集的这篇文章主要介绍重学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值,不等就抛异常

最后

以上就是坦率小松鼠为你收集整理的重学java之ArrayList modCount的全部内容,希望文章能够帮你解决重学java之ArrayList modCount所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部