LinkedList之modCount和expectedModCount

Posted 不吃陈皮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinkedList之modCount和expectedModCount相关的知识,希望对你有一定的参考价值。

modCount和expectedModCount是用于表示修改次数的,其中modCount表示集合的修改次数,这其中包括了调用集合本身的add方法等修改方法时进行的修改和调用集合迭代器的修改方法进行的修改。而expectedModCount则是表示迭代器对集合进行修改的次数。

设置expectedModCount的目的就是要保证在使用迭代器期间,LinkedList对象的修改只能通过迭代器且只能这一个迭代器进行。

集合是如何保证的呢?

在创建迭代器的时候会把对象的modCount的值传递给迭代器的expectedModCount:

1  private class ListItr implements ListIterator<E> {
2         private Node<E> lastReturned;
3         private Node<E> next;
4         private int nextIndex;
5         private int expectedModCount = modCount;

如果创建多个迭代器对一个集合对象进行修改的话,那么就会有一个modCount和多个expectedModCount,且modCount的值之间也会不一样,这就导致了moCount和expectedModCount的值不一致,从而产生异常:

 1 public E next() {
 2             checkForComodification();
 3             if (!hasNext())
 4                 throw new NoSuchElementException();
 5 
 6             lastReturned = next;
 7             next = next.next;
 8             nextIndex++;
 9             return lastReturned.item;
10         }

上面的代码中的checkForComodification会检查modCount和expectedModCount的值是否一致,不一致则抛出异常。

1   final void checkForComodification() {
2             if (modCount != expectedModCount)
3                 throw new ConcurrentModificationException();
4         }

 

以上是关于LinkedList之modCount和expectedModCount的主要内容,如果未能解决你的问题,请参考以下文章

集合类中modCount字段的作用

modCount是什么,为什么源码经常看到?

Java 之 集合中的 modCount的作用

去年去阿里面试,被问到ArrayList和LinkedList,我是这样回答的!

LinledList源码解析

java modCount和fail-fast