讨论一下:Java的for循环是怎样执行的?

FreeDove FreeDove 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
public class Test {
public static void main(String[] args) {
List<Long> list = new ArrayList<Long>();
list.add(new Long(1);
list.add(new Long(2));
list.add(new Long(3));
list.add(new Long(4));
list.add(new Long(5));

for(Long l : list) {
System.out.println("run.");
list.remove(l);
}
}
}

运行报错:
run.
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at com.lance.Test.main(Test.java:31)

可见只循环了一次,第二次在for中判断是报错,可是我第一轮循环时仅remove了一个元素而已。

把for循环更改写法:
for(int i=0;i<list.size();i++) {
Long l = list.get(i);
list.remove(l);
System.out.println("run." + i + ", l=" + l + ", list.size():" + list.size());
}

运行结果:
run.0, l=1, list.size():4
run.1, l=3, list.size():3
run.2, l=5, list.size():2
循环了3次,正确的,因为前面几次循环都remove掉元素,到最后一次size为2,可是i已经累加到3了。

如果for中写法变成
for(int i=0, ls=list.size();i<l;i++)

没有每次重新读取list size,会出现下标越界。这也好理解。

只是像最前面的写法
for(Long l : list)
这种仅运行一次,第二次就报错了呢,报错的行数就是for的这一行,这时虚拟机在验证什么?
...全文
评论 16
收藏 已收藏
分享
返回顶部
FreeDove
Java SE 62,621 成员 307,251 内容