为什么可以通过迭代器将项目添加到集合中?

W.C*_*ron 3 java iterator

我正在阅读AbstractList的代码,其中有一个嵌套类Itr,这很好。什么混淆我是为什么的Java提供了一套方法给它的迭代器,以便它可以用来修改underlaying的集合,比如add()remove()set()

您必须将集合公开给Iterator的根本原因是什么?它比通过Collection的方法修改集合更方便吗?

private class Itr implements Iterator<E> {

    //......bha

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

        try {
            AbstractList.this.remove(lastRet);
            if (lastRet < cursor)
                cursor--;
            lastRet = -1;
            expectedModCount = modCount;
        } catch (IndexOutOfBoundsException e) {
            throw new ConcurrentModificationException();
        }
    }
}

  private class ListItr extends Itr implements ListIterator<E> {
    ListItr(int index) {
        cursor = index;
    }
    public void set(E e) ///...
   public void add(E e) //.....
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 6

如果在迭代集合时直接对其进行修改,则可能会得到一个,ConcurrentModificationException因为迭代器可能变得无效。但是,如果通过迭代器进行操作,则迭代器的实现可以确保修改后迭代器(迭代器)仍然有效。

但是,如果迭代器代码不知道有关修改的信息,则无法执行此操作,这就是为什么要通过迭代器而不是直接进行修改的原因。

尽管可以设计集合和迭代器,以便直接修改集合可以确保它使所有迭代器保持最新状态,但它要复杂得多,并且JDK设计人员没有走这条路。