概述
看到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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复