我正在阅读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)
如果在迭代集合时直接对其进行修改,则可能会得到一个,ConcurrentModificationException因为迭代器可能变得无效。但是,如果通过迭代器进行操作,则迭代器的实现可以确保修改后迭代器(迭代器)仍然有效。
但是,如果迭代器代码不知道有关修改的信息,则无法执行此操作,这就是为什么要通过迭代器而不是直接进行修改的原因。
尽管可以设计集合和迭代器,以便直接修改集合可以确保它使所有迭代器保持最新状态,但它要复杂得多,并且JDK设计人员没有走这条路。