java迭代器不能修改集合值,为什么不能在foreach循环中修改集合?

  • Post author:
  • Post category:java


《阿里巴巴JAVA开发手册》中有这样一条:

不要在 foreach 循环里进行元素的 add / remove 操作,remove 元素使用 Iterator 方式。

经测试,当在 foreach 循环中 add / remove 集合元素,可能会抛出 ConcurrentModificationException 异常,下面介绍进行详细说明。

1. foreach循环

foreach 又称为增强型for循环,通过打印以下代码的class字节码,我们来了解下其内部实现。

List list = new ArrayList<> ();

list.add(“a”);

list.add(“b”);

for (String item : list) {

System.out.println(item);

}

使用javap -c 命令查看class文件的字节码:

724f763fd242?from=singlemessage

image

由上图红框圈起的部分不难发现,foreach 循环内部实际是通过 Iterator 实现的,以上代码等同于:

List list = new ArrayList<> ();

list.add(“a”);

list.add(“b”);

for (Iterator i = list.