集合 · 单选题 · 第 12 题
Java 后端开发面试 · 第 12 题
用增强 for 循环遍历 ArrayList 时,在循环体里调用 list.remove(obj) 删除元素,通常会发生什么?
- A正常删除该元素,遍历继续进行且不会报任何错误
- B陷入死循环,迭代器反复访问同一个元素无法结束
- C编译失败,编译器提示不能在增强 for 循环中修改集合
- D抛出 ConcurrentModificationException
答案
D D. 抛出 ConcurrentModificationException
解析
增强 for 循环底层用迭代器,list.remove 会让 modCount 变化,迭代器下一次调用 next 时发现与 expectedModCount 不一致,就抛出异常,这就是 fail-fast 机制。特例是删除倒数第二个元素时,hasNext 直接返回 false,不会报错,所以说「通常」。正确做法是用 Iterator.remove 或 removeIf。