最近在看《阿里巴巴Java开发手册》时,(五)集合处理-7【强制】不要在foreach循环里进行元素的remove/add
操作。这一条规则中,有一段非常有意思的代码:
> List<String> list = new ArrayList<>(); list.add("1"); list.add("2");
>
> for (String item : list) {
> if ("1".equals(item)) {
> list.remove(item);
> }
> }
执行这段代码,没有任何问题,foreach循环不会抛出任何异常,而且元素移除成功。但是,当我们把if ("1".equals(item))
改成if ("2".equals(item))
时,程序会抛出ConcurrentModificationException
。如下图所示:
通过分析foreach
实现机制以及抛出的代码行数,很容易得知其原因。
foreach实现机制
我们知道,foreach
是Java的一个语法糖,通过反编译测试类生成的代码,我们知道它实际上是由Iterator
实现的。反编译的结果如下:
> List<String> list = new <