/**
* The number of times this list has been <i>structurally modified</i>.
* Structural modifications are those that change the size of the
* list, or otherwise perturb it in such a fashion that iterations in
* progress may yield incorrect results.
*
* <p>This field is used by the iterator and list iterator implementation
* returned by the {@code iterator} and {@code listIterator} methods.
* If the value of this field changes unexpectedly, the iterator (or list
* iterator) will throw a {@code ConcurrentModificationException} in
* response to the {@code next}, {@code remove}, {@code previous},
* {@code set} or {@code add} operations. This provides
* <i>fail-fast</i> behavior, rather than non-deterministic behavior in
* the face of concurrent modification during iteration.
*
* <p><b>Use of this field by subclasses is optional.</b> If a subclass
* wishes to provide fail-fast iterators (and list iterators), then it
* merely has to increment this field in its {@code add(int, E)} and
* {@code remove(int)} methods (and any other methods that it overrides
* that result in structural modifications to the list). A single call to
* {@code add(int, E)} or {@code remove(int)} must add no more than
* one to this field, or the iterators (and list iterators) will throw
* bogus {@code ConcurrentModificationExceptions}. If an implementation
* does not wish to provide fail-fast iterators, this field may be
* ignored.
*/
protected transient int modCount = 0;
在父类AbstractList中定义了一个int型的属性:modCount,记录了ArrayList结构性变化的次数。
protected transient int modCount = 0;
在ArrayList的所有涉及结构变化的方法中都增加modCount的值,包括:add()、remove()、addAll()、removeRange()及clear()方法。这些方法每调用一次,modCount的值就加1。
注:add()及addAll()方法的modCount的值是在其中调用的ensureCapacity()方法中增加的。
AbstractList中的iterator()方法(ArrayList直接继承了这个方法)使用了一个私有内部成员类Itr,生成一个Itr对象(Iterator接口)返回:
public Iterator iterator() { return new Itr(); }
Itr实现了Iterator()接口,其中也定义了一个int型的属性:expectedModCount,这个属性在Itr类初始化时被赋予ArrayList对象的modCount属性的值。
int expectedModCount = modCount;
注:内部成员类Itr也是ArrayList类的一个成员,它可以访问所有的AbstractList的属性和方法。理解了这一点,Itr类的实现就容易理解了。
在Itr.hasNext()方法中:
public boolean hasNext() { return cursor != size(); }
调用了AbstractList的size()方法,比较当前光标位置是否越界。
在Itr.next()方法中,Itr也调用了定义在AbstractList中的get(int)方法,返回当前光标处的元素:
public Object next()
{
try
{
Object next = get(cursor);
checkForComodification();
lastRet = cursor++;
return next;
}
catch(IndexOutOfBoundsException e)
{
checkForComodification();
throw new NoSuchElementException();
}
}
注意,在next()方法中调用了checkForComodification()方法,进行对修改的同步检查:
final void checkForComodification()
{
if (modCount != expectedModCount) throw new ConcurrentModificationException(); }
现在对modCount和expectedModCount的作用应该非常清楚了。在对一个集合对象进行跌代操作的同时,并不限制对集合对象的元素进行操
作,这些操作包括一些可能引起跌代错误的add()或remove()等危险操作。在AbstractList中,使用了一个简单的机制来规避这些风险。
这就是modCount和expectedModCount的作用所在。
分享到:
相关推荐
### JAVA初学教程之AbstractList详解 对于Java初学者来说,理解Java集合框架的基本组成部分及其工作原理至关重要。本文将深入探讨`AbstractList`类的重要性和使用场景,帮助初学者掌握如何利用`AbstractList`来创建...
`AbstractList`类是`List`接口的一个抽象实现,它为所有`List`子类提供了一个基本框架。在`AbstractList`类中,迭代器是由内部类`Itr`实现的。下面详细介绍`Itr`类的关键部分。 1. **构造函数**: - `AbstractList...
java8 源码 List相关实现类的源码解析(JDK1.8) ...通过modCount的值来判断是否多线程同时操作,modCount用来记录List修改的次数:每修改一次(添加/删除等操作),将modCount+1 LinkedList 继承关系: LinkedLis
public class Vector<E> extends AbstractList<E> implements List, RandomAccess, Cloneable, java.io.Serializable { ... } ``` Vector 底层也是一个对象数组,protected Object\[] elementData; 这个数组用于...
public abstract class AbstractList extends AbstractCollection implements List { // 返回一个具体的迭代器实例 public Iterator iterator() { return new Itr(); } // 具体迭代器实现 private class Itr ...
`ArrayList`类继承自`AbstractList`抽象类,并实现了`List`接口、`RandomAccess`接口、`Cloneable`接口以及`Serializable`接口。其中: - `AbstractList`提供了一些通用的方法实现。 - `List`接口定义了一个有序的...
ArrayList继承自AbstractList,并实现了List接口,它使用一个Object类型的数组elementData来存储元素。ArrayList提供了灵活的容量扩展机制,允许在运行时动态增长以适应元素数量的变化。 #### 1. 空参构造方法 ...
modCount字段是AbstractList中的protected transient int类型,用于记录ArrayList结构上的修改次数。 六、transient transient是Java中的保留字,用于标记对象的某些成员变量不需要被持久化。 七、ArrayList的...
// Increments modCount!! elementData[size++] = e; return true; } ``` - **`ensureCapacityInternal`**:确保有足够的容量容纳新增的元素。如果当前容量不足以容纳新增的元素,则会进行扩容处理。 - **`...
ArrayList和Vector都继承自AbstractList,实现了List接口,同时也实现了RandomAccess接口,表明它们支持快速随机访问。LinkedList则直接实现了List接口,没有实现RandomAccess,因为它不支持快速随机访问。 总结...
ArrayList是Java集合框架中的一种动态数组,它继承自AbstractList,并实现了List接口。ArrayList主要用于存储可变大小的对象列表,它的核心是通过一个Object类型的数组elementData来实现数据存储。在本章节,我们将...
在Java的`AbstractList`中,迭代器是通过`iterator()`方法返回的内部类`Itr`实现的,这个内部类维护了遍历状态,如当前位置`cursor`和修改计数`modCount`,确保在遍历过程中对容器的修改能够被正确处理。 总结来说...
expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } ``` 从上面的代码可以看到,remove方法使用lastRet的索引来删除元素,并更新...
public class ArrayList<E> extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable ``` 数组的初始容量默认为 10: ```java private static final int DEFAULT_CAPACITY = 10; `...
它继承自AbstractList,并实现了List接口,提供了丰富的操作方法。ArrayList的主要特点是其内部基于数组(Object[] elementData)进行存储,因此它的操作速度对于随机访问非常快,但插入和删除元素时,特别是当元素...