Java笔记 迭代器Itr

1、Itr是AbstractList里面的一个内部类,实现了Iterator接口。

public Iterator iterator() {
        return new Itr();
    }

2、分析Itr。

private class Itr implements Iterator {
    //下一个元素的索引位置
    int cursor = 0;

    //lastRet表示上一个元素的索引位置, 如果执行了remove操作会置为-1
    int lastRet = -1;

    /*来判断遍历过程中集合是否被修改过
     modCount用于记录ArrayList集合的修改次数,初始化为0,
     每当集合被修改一次,如add、remove等操作,modCount + 1,所以如果modCount不变,则表示集合内容没有被修改
     主要是用于实现ArrayList集合的快速失败机制
    */
    int expectedModCount = modCount;

    public boolean hasNext() {
        return cursor != size();
    }

    public E next() {
        //判断集合是否被修改
        checkForComodification();
        try {
            int i = cursor;
            E next = get(i);
            //改变上一个和当前索引位置
            lastRet = i;
            cursor = i + 1;
            return next;
        } catch (IndexOutOfBoundsException e) {
            checkForComodification();
            throw new NoSuchElementException();
        }
    }

    public void remove() {
        if (lastRet < 0)
            throw new IllegalStateException();
        //判断集合是否被修改
        checkForComodification();
        try {
            //调用list的remove操作
            AbstractList.this.remove(lastRet);
            if (lastRet < cursor)
                cursor--;
            //将上一个元素的索引位置置为-1
            lastRet = -1;
            //重新赋值expectedModCount
            expectedModCount = modCount;
        } catch (IndexOutOfBoundsException e) {
            throw new ConcurrentModificationException();
        }
    }

    //判断集合是否被修改
    final void checkForComodification() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }
}

3、迭代器删除元素错误情况。
(1)错误1

import java.util.Iterator;
import java.util.ArrayList;

public class Test{
    public static void main(String srgs[]) {
        ArrayList list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        Iterator iterator = list.iterator();
        iterator.remove();
    }
}

执行结果:


TIM截图20180413145538.png

原因是:在remove的时候会判断lastRet<0 ,而lastRet 的初始值为-1。

public void remove() {
        if (lastRet < 0)
            throw new IllegalStateException();
      ...
    }

(2)错误2

import java.util.Iterator;
import java.util.ArrayList;

public class Test{
    public static void main(String srgs[]) {
        ArrayList list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        Iterator iterator = list.iterator();
        iterator.next();
        iterator.remove();
        iterator.remove();
    }
}

执行结果:


TIM截图20180413145538.png

原因:在执行next后lastRet = 0,执行第一个Remove,后 lastRet = -1 。
(3)错误3

import java.util.Iterator;
import java.util.ArrayList;

public class Test{
    public static void main(String srgs[]) {
        ArrayList list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        Iterator iterator = list.iterator();
        while(iterator.hasNext()) {
            String next = (String)iterator.next();
            if(next.equals("a")) {
                list.remove("a");
            }
        }
    }
}

执行结果:

TIM截图20180413150527.png

错误原因:
list.remove(obj),操作会导致 modCount + 1, 导致expectedModCount == modCount 不成立。
4、迭代器正确删除元素方法。

import java.util.Iterator;
import java.util.ArrayList;

public class Test{
    public static void main(String srgs[]) {
        ArrayList list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        Iterator iterator = list.iterator();
        while(iterator.hasNext()) {
            String next = (String)iterator.next();
            if(next.equals("a")) {
                iterator.remove();
            }
        }
        System.out.println("list:" + list);
    }
}

执行结果:


TIM截图20180413152035.png

你可能感兴趣的:(Java笔记 迭代器Itr)