迭代器相关问题

时间:2014-09-16 12:33:56

标签: java

我知道在ArrayList中,这个类的iterator和listIterator方法返回的迭代器都是快速失败的。

所以,如果我写下面的东西。由于我使用List对象来删除而不是使用Iterator删除所以它抛出了concurrentModification异常,因为在这种情况下expectedModCount不等于ModCount。

    List<String> n = new ArrayList<String>();
    n.add("1");
    n.add("2");
    n.add("3");
    n.add("4");


    Iterator<String> i = n.iterator();
    while(i.hasNext())
    {
        String t = i.next();
        if(t.equals("4"))
            n.remove(t);
        System.out.println(t);

    }

但是如果删除列表中的倒数第二个元素,则不会抛出异常。 即如果你写(在if语句t.remove("1")t.remove("2")t.remove("4")),它会抛出concurrentModificationException。但如果我写t.remove("3"),那么这个例外是没有抛出。

可能是什么原因?

1 个答案:

答案 0 :(得分:0)

在AbstractList中有一个名为modCount的字段,用于存储此列表已被结构修改的次数,以及一个名为Itr的实现Iterator的内部类创建了一个名为expectedModCount的变量,该变量在modC​​ount的开头初始化。在迭代modCount!= expectedModCount
期间抛出concurrentModificationException 这是代码

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

        try {
            ArrayList.this.remove(lastRet);
            cursor = lastRet;
            lastRet = -1;
            expectedModCount = modCount;
        } catch (IndexOutOfBoundsException ex) {
            throw new ConcurrentModificationException();
        }
    }