我正在阅读 AbstractList 的代码,其中有一个嵌套类 Itr,这很好。让我困惑的是为什么Java为其Iterator提供了一组方法,以便可以使用它来修改底层集合,例如add(),,,remove()。set()必须将集合暴露给迭代器的根本原因是什么?它比通过 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) //.....
1 回答
开心每一天1111
TA贡献1836条经验 获得超13个赞
如果在迭代时直接ConcurrentModificationException
修改集合,则很可能会得到 a ,因为迭代器可能会变得无效。但如果你通过迭代器来完成,那么迭代器的实现可以确保它(迭代器)在修改后仍然有效。
但是,如果迭代器代码不知道修改,则它无法执行此操作,这就是您通过迭代器而不是直接执行此操作的原因。
虽然可以设计集合和迭代器,直接修改集合将确保它使所有迭代器保持最新,但它要复杂得多,而且 JDK 设计者并没有走这条路。
添加回答
举报
0/150
提交
取消