标签:shm methods 没有 赋值 call 期望 删除元素 data more
/**
 * 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;
public void deleteTest(){
    List<String> list = new ArrayList();
    list.add("aaaaaa");
    list.add("bbbbbb");
    list.add("cccccc");
    list.add("dddddd");
    list.add("eeeeee");
    Iterator it = list.iterator();
    int i = 0;
    String s = null;
    while(it.hasNext()){
        if(i==2){
            it.remove();// 如果用list.remove(it.next());会报异常
        }
        System.out.println("第"+i+"个元素"+it.next());
        i++ ;
    }
    System.out.println("----------------");
    Iterator it2 = list.iterator();
    while(it2.hasNext()){
        System.out.println(it2.next());
    }
}
注意:第14行,如果用list.remove(it.next());会报ConcurrentModificationException异常,原因参上。
public Iterator<E> iterator() {
    return new Itr();
}
返回的是一个Itr对象,这个Itr是ArrayList的内部类
private class Itr implements Iterator<E> {
    int cursor;       // index of next element to return   //下一个元素的游标
    int lastRet = -1; // index of last element returned; -1 if no such  //上一个元素的
    int expectedModCount = modCount;  //修改计数器期望值
    public boolean hasNext() {
        return cursor != size;
    }
    @SuppressWarnings("unchecked")
    public E next() {
        checkForComodification();
        int i = cursor; //此时的游标,指向的是本次要遍历的对象,因为上一次已经++了,初始值为0,没有++的情况下是第一个元素
        if (i >= size)   //越界了
            throw new NoSuchElementException();
        Object[] elementData = ArrayList.this.elementData; 
        if (i >= elementData.length) 
            throw new ConcurrentModificationException();
        cursor = i + 1;  //游标指向了下一个元素, 但 i 的值没有变
        return (E) elementData[lastRet = i];   //将 i 赋值给lastRet,取的值是方法开始时int i=cursor;中的cursor指向的值,而且最终这个游标的数值赋值给了lastRet
    }
    public void remove() {
        if (lastRet < 0)  // 如果没有next()操作就直接remove的话,lastRet=-1,会抛异常
            throw new IllegalStateException();
        checkForComodification();
        try {
            ArrayList.this.remove(lastRet); // remove之前,cursor、lastRet的值没有修改,都是上次next之后的值,因此此处的lastRet指向上次next获取的元素
            cursor = lastRet;
            lastRet = -1;
            expectedModCount = modCount;  // 手动将ArrayList.remove()后modCount的值赋给expectedModCount,避免引起不一致
        } catch (IndexOutOfBoundsException ex) {
            throw new ConcurrentModificationException();
        }
    }
    @Override
    @SuppressWarnings("unchecked")
    public void forEachRemaining(Consumer<? super E> consumer) {
        Objects.requireNonNull(consumer);
        final int size = ArrayList.this.size;
        int i = cursor;
        if (i >= size) {
            return;
        }
        final Object[] elementData = ArrayList.this.elementData;
        if (i >= elementData.length) {
            throw new ConcurrentModificationException();
        }
        while (i != size && modCount == expectedModCount) {
            consumer.accept((E) elementData[i++]);
        }
        // update once at end of iteration to reduce heap write traffic
        cursor = i;
        lastRet = i - 1;
        checkForComodification();
    }
    final void checkForComodification() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }
}
标签:shm methods 没有 赋值 call 期望 删除元素 data more
原文地址:http://www.cnblogs.com/nevermorewang/p/7808197.html