1.遍历List集合时删除元素可能会发生什么异常?
ConcurrentModificationException
在 Java 中,ArrayList 是一个使用 Fail-Fast 机制的例子。
ConcurrentHashMap是一个使用 Fail-Safe机制的例子。
Fail-Fast
机制,当在迭代过程中检测到集合被修改(添加、删除元素)时,立即抛出ConcurrentModificationException异常,以避免出现并发修改导致的不确定性行为。在Java中,
Fail-Fast
和Fail-Safe
是两种不同的迭代器(Iterator)机制,它们主要涉及到在遍历集合时对集合的修改的处理方式。以下是它们的简要介绍:
- Fail-Fast(快速失败)机制:
定义: 当在迭代过程中检测到集合被修改(添加、删除元素)时,立即抛出
ConcurrentModificationException
异常,以避免出现并发修改导致的不确定性行为。实现: 基于集合(
AbstractList
)内部维护的一个"modCount"变量,该变量记录了集合被修改的次数。在每次迭代开始时,迭代器会自己维护一个"expectedModCount"变量,初始值取自集合的"modCount"变量,在迭代过程中,如果"modCount"和"expectedModCount"不一致,就抛出异常。public class ArrayList<E> extends AbstractList<E> implements List<E> { // ... //继承自AbstractList,写在这里便于理解 private int modCount = 0; // ... public Iterator<E> iterator() { return new Itr();