为了方便处理集合中的元素,Java中设置了一个对象,该对象提供了一些方法专门处理集合中的元素,这个对象就叫做迭代器(Iterator)
对Collection进行迭代的类,称其为迭代器,但是该对象比较特殊,不能直接创建对象(通过new),在Collection接口中定义了获取集合类迭代器的方法iterator(),所以所有的Collection体系集合都可以获取自身的迭代器
Iterable是Collection的父接口,该接口中只提供了一个方法,用来返回Iterator对象,所以Collection具备了自身迭代的方法。
package java.lang;
import java.util.Iterator;
/** Implementing this interface allows an object to be the target of
* the "foreach" statement.
* @since 1.5
*/
public interface Iterable<T> {
Iterator<T> iterator();
}
在Ietrator接口中定义了三个方法
package java.util;
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
boolean hasNext();判断集合中是否有元素,如果元素可以迭代,就返回true。
E next(); 返回迭代的下一个元素,如果没有下一个元素,调用该方法会报异常。
void remove(); 从迭代器指向的集合中移除迭代器返回的最后一个元素。
在集合进行迭代过程中,不允许出现迭代器以外的对象操作。
比如
Iterator it = list.iterator();
while (it.hasNext()) {
it.next();
it.remove();
list.add("abc"); // 出现了迭代器以外的对元素的操作
}
因为在迭代过程中出现了迭代器以外对元素的操作,所以会报出异常(java.util.ConcurrentModificationException)。
List特有的迭代器ListIterator
如果是List集合,向要在迭代中操作元素可以使用List集合的特有迭代器ListIterator,该迭代器支持在迭代过程中,添加元素和修改元素。
package java.util;
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
void remove();
//-------------------------Iterator子接口List专属的迭代器
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void set(E e);
void add(E e);
}
Iterator在迭代是,只能对元素进行获取(next())和删除(remove())操作,而ListIterator在迭代list集合是,还可以对元素进行增加(add)和修改(set)操作。