`
liuzhaomin
  • 浏览: 204266 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

AbstractList modCount

 
阅读更多
/**
     * 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初学教程教你学会JAVA4

    ### JAVA初学教程之AbstractList详解 对于Java初学者来说,理解Java集合框架的基本组成部分及其工作原理至关重要。本文将深入探讨`AbstractList`类的重要性和使用场景,帮助初学者掌握如何利用`AbstractList`来创建...

    Java源码分析:深入探讨Iterator模式

    `AbstractList`类是`List`接口的一个抽象实现,它为所有`List`子类提供了一个基本框架。在`AbstractList`类中,迭代器是由内部类`Itr`实现的。下面详细介绍`Itr`类的关键部分。 1. **构造函数**: - `AbstractList...

    java8源码-csn-list:ArrayList、LinkedList、Vector、Stack源码分析

    java8 源码 List相关实现类的源码解析(JDK1.8) ...通过modCount的值来判断是否多线程同时操作,modCount用来记录List修改的次数:每修改一次(添加/删除等操作),将modCount+1 LinkedList 继承关系: LinkedLis

    Vector底层结构和源码分析

    public class Vector&lt;E&gt; extends AbstractList&lt;E&gt; implements List, RandomAccess, Cloneable, java.io.Serializable { ... } ``` Vector 底层也是一个对象数组,protected Object\[] elementData; 这个数组用于...

    迭代器Iterator.txt

    public abstract class AbstractList extends AbstractCollection implements List { // 返回一个具体的迭代器实例 public Iterator iterator() { return new Itr(); } // 具体迭代器实现 private class Itr ...

    arrayList源代码

    `ArrayList`类继承自`AbstractList`抽象类,并实现了`List`接口、`RandomAccess`接口、`Cloneable`接口以及`Serializable`接口。其中: - `AbstractList`提供了一些通用的方法实现。 - `List`接口定义了一个有序的...

    硬核ArrayList源码分析,答应我每天看一遍好么

    ArrayList继承自AbstractList,并实现了List接口,它使用一个Object类型的数组elementData来存储元素。ArrayList提供了灵活的容量扩展机制,允许在运行时动态增长以适应元素数量的变化。 #### 1. 空参构造方法 ...

    Java编程中ArrayList源码分析

    modCount字段是AbstractList中的protected transient int类型,用于记录ArrayList结构上的修改次数。 六、transient transient是Java中的保留字,用于标记对象的某些成员变量不需要被持久化。 七、ArrayList的...

    ArrayList底层.pdf

    // Increments modCount!! elementData[size++] = e; return true; } ``` - **`ensureCapacityInternal`**:确保有足够的容量容纳新增的元素。如果当前容量不足以容纳新增的元素,则会进行扩容处理。 - **`...

    javalist数据结构-Java数据结构-------List.pdf

    ArrayList和Vector都继承自AbstractList,实现了List接口,同时也实现了RandomAccess接口,表明它们支持快速随机访问。LinkedList则直接实现了List接口,没有实现RandomAccess,因为它不支持快速随机访问。 总结...

    第二章 ArrayList源码解析1

    ArrayList是Java集合框架中的一种动态数组,它继承自AbstractList,并实现了List接口。ArrayList主要用于存储可变大小的对象列表,它的核心是通过一个Object类型的数组elementData来实现数据存储。在本章节,我们将...

    使用迭代器模式来进行Java的设计模式编程

    在Java的`AbstractList`中,迭代器是通过`iterator()`方法返回的内部类`Itr`实现的,这个内部类维护了遍历状态,如当前位置`cursor`和修改计数`modCount`,确保在遍历过程中对容器的修改能够被正确处理。 总结来说...

    Java集合删除元素ArrayList实例详解

    expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } ``` 从上面的代码可以看到,remove方法使用lastRet的索引来删除元素,并更新...

    java集合(自学整理)

    public class ArrayList&lt;E&gt; extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable ``` 数组的初始容量默认为 10: ```java private static final int DEFAULT_CAPACITY = 10; `...

    Java实习生面试复习(三):ArrayList

    它继承自AbstractList,并实现了List接口,提供了丰富的操作方法。ArrayList的主要特点是其内部基于数组(Object[] elementData)进行存储,因此它的操作速度对于随机访问非常快,但插入和删除元素时,特别是当元素...

Global site tag (gtag.js) - Google Analytics