东东
发布于 2022-10-09 / 31 阅读 / 0 评论 / 0 点赞

JAVA迭代器

Java Iterator(迭代器)

Iterator为Java中的迭代器对象,是能够对List这样的集合进行迭代遍历的底层依赖。

public interface Iterator<E> {
    boolean hasNext();
    E next();
}

iterator通过以上两个方法定义了对集合迭代访问的方法,而具体的实现方式依赖于不同的实现类,具体的集合类实现Iterator接口中的方法以实现迭代。
特点:

  1. Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭 代器实例。迭代器取代了 Java 集合框架中的 Enumeration,迭代器允许调用者在迭代过程中移除元 素。
  2. Iterator 的特点是只能单向遍历,但是更加安全,因为它可以确保,在当前遍历 的集合元素被更改的时候,就会抛出 ConcurrentModificationException 异常。
  3. 边遍历边修改 Collection 的唯一正确方式是使用 Iterator.remove() 方法

Java Iterable(迭代器)

观察Java类,实际上具体的集合类并不是直接实现的Java Iterator接口,而是通过实现Java Iterable接口。
通过代码可以知道Iterable其实只是返回了一个Iterator对象

public interface Iterable<T> {
  Iterator<T> iterator();
}

Iterable与Iterator关系

有一个问题,为什么不直接将hasNext(),next()方法放在Iterable接口中,其他类直接实现就可以了?
因为有些集合类可能不止一种遍历方式,实现了Iterable的类可以再实现多个Iterator内部类,例如LinkedList中的ListItr和DescendingIterator两个内部类,就分别实现了双向遍历和逆序遍历。通过返回不同的Iterator实现不同的遍历方式,这样更加灵活。如果把两个接口合并,就没法返回不同的Iterator实现类了。