java.util.Iterator 接口用于 Java 集合框架中,以允许修改集合,同时仍对其进行迭代。如果您只想干净地迭代整个集合,请改用 for-each,但 Iterators 的一个优点是您可以获得的功能:可选的 remove() 操作,对于 List Iterator 接口甚至更好,它提供了 add () 和 set() 操作。这两个接口都允许您迭代集合并同时在结构上更改它。在使用 for-each 遍历集合时尝试修改集合会抛出 ConcurrentModificationException,通常是因为集合被意外修改!
看看 ArrayList 类
它内部有 2 个私有类(内部类),称为 Itr 和 ListItr
它们分别实现了 Iterator 和 ListIterator 接口
public class ArrayList..... { //封闭类
private class Itr implements Iterator<E> {
public E next() {
return ArrayList.this.get(index++); //rough, not exact
}
//we have to use ArrayList.this.get() so the compiler will
//know that we are referring to the methods in the
//enclosing ArrayList class
public void remove() {
ArrayList.this.remove(prevIndex);
}
//checks for...co mod of the list
final void checkForComodification() { //ListItr gets this method as well
if (ArrayList.this.modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
}
private class ListItr extends Itr implements ListIterator<E> {
//methods inherted....
public void add(E e) {
ArrayList.this.add(cursor, e);
}
public void set(E e) {
ArrayList.this.set(cursor, e);
}
}
}
当您调用方法 iterator() 和 listIterator() 时,它们返回私有类 Itr 或 ListItr 的新实例,并且由于这些内部类“在”封闭的 ArrayList 类中,它们可以自由修改 ArrayList 而不会触发 ConcurrentModificationException , 除非您通过 ArrayList 类的 set() add() 或 remove() 方法同时(同时)更改列表。