迭代器接口是迭代器模式实现的精髓:
public interface Iterator<E> { boolean hasNext(); E next(); ... }
假设某容器名为 XxCollection(该类本身并不需实现 Iterator 接口),调用其迭代器遍历访问其所有成员时,一般是通过其 iterator() 方法(Java 容器类如 ArrayList/LinkedList 下的 iterator 也是如下所示)
public class XxCollection<E> { public Iterator<E> iterator() { return new Iter(); } }
而 Iter 类是 XxCollection 类内的私有类:
private class Itr implements Iterator<E> { public boolean hasNext() { .... } public E next() { .... } }
1. Iterator 与 Iterable
Iterator
package java.util; public interface Iterator<E> { boolean hasNext(); E next(); void remove(); }
Iterable
package java.lang; import java.util.Iterator; public Interface Iterable<T> { Iterator<T> iterator(); }
2. 如何在 java 容器中使用迭代器
// 两个不同的 List 子类
List<String> list = new ArrayList<String>();
List<String> linkList = new LinkedList<String>();
void iterate(List<String> list) {
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
....
}
}
3. Iterator 遍历时不可以删除集合中的元素
在使用Iterator的时候禁止对所遍历的容器进行改变其大小结构的操作。例如: 在使用Iterator进行迭代时,如果对集合进行了add、remove操作就会出现ConcurrentModificationException异常。
因为在你迭代之前,迭代器已经被通过list.itertor()创建出来了,如果在迭代的过程中,又对list进行了改变其容器大小的操作,那么Java就会给出异常。因为此时Iterator对象已经无法主动同步list做出的改变,Java会认为你做出这样的操作是线程不安全的,就会给出善意的提醒(抛出ConcurrentModificationException异常)