星海

集合 · 单选题 · 第 12 题

Java 后端开发面试 · 第 12 题

用增强 for 循环遍历 ArrayList 时,在循环体里调用 list.remove(obj) 删除元素,通常会发生什么?

  1. A正常删除该元素,遍历继续进行且不会报任何错误
  2. B陷入死循环,迭代器反复访问同一个元素无法结束
  3. C编译失败,编译器提示不能在增强 for 循环中修改集合
  4. D抛出 ConcurrentModificationException

答案

D D. 抛出 ConcurrentModificationException

解析

增强 for 循环底层用迭代器,list.remove 会让 modCount 变化,迭代器下一次调用 next 时发现与 expectedModCount 不一致,就抛出异常,这就是 fail-fast 机制。特例是删除倒数第二个元素时,hasNext 直接返回 false,不会报错,所以说「通常」。正确做法是用 Iterator.remove 或 removeIf。

在线刷这套题:即时判分、错题本、闪卡复习,不用登录就能练。