什么是迭代器?

Java中提供了很多集合类,这些集合类的数据结构不一样,因此在存储和遍历时的方式不一样。迭代器抽象出集合类的共有功能,提取判断功能和获取功能,得到接口,这个接口就是迭代器接口。在具体子类中实现迭代器接口中的若干方法(使用内部类实现这若干个方法)

  • 在Java中,有很多的数据容器,对于这些的操作有很多的共性。Java采用了迭代器来为各种容器提供了公共的操作接口。这样使得对容器的遍历操作与其具体的底层实现隔离,达到解耦的效果
  • Iterator对象称为迭代器,主要用于遍历Collection集合中的元素
  • 所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口对象,即可返回一个迭代器
  • Iterator仅用于遍历集合,Iterator本身不存放对象

Collection接口

Collection接口api:public interface Collection<E> extends Iterable<E>,该接口有一个父接口Iterable,该接口中有一个方法:public interface Iterable<T>,实现这个接口允许对象称为foreach语句的目标。

方法

iterable 返回一个在一组T类型的元素上进行迭代的迭代器

接口中的这个方法返回类型是Iterator类型的接口。继续查看Iterator接口。有三个方法

在Iterator接口中定义了三个方法

HasNext() 如果仍有元素可以迭代,则返回ture
next() 返回迭代的下一个元素
remove() 从迭代器指向的Collection中移除迭代器返回的最后一个元素(可选操作)

迭代器使用

  • 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素:iterator()方法是java.lang.Iterable接口,被Collection继承
  • 使用next():获得序列中的下一个元素
  • 使用hasNext():检查序列中是否还有元素
  • 使用remove():将迭代器新返回的元素删除

代码演示

  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. public class IteratorTest {
  4. public static void main(String[] args) {
  5. ArrayList list = new ArrayList();//右边是ArrayList的实例,即运行时是ArrayList的实例,因此最终返回的就是ArrayList类中的内部类Itr的实例对象。
  6. list.add(100);
  7. list.add(200);
  8. list.add(300);
  9. Iterator it = list.iterator();//左边是接口,右边是具体类实例对象
  10. while (it.hasNext()) {
  11. Object next = it.next();
  12. System.out.println(next);// 100 200 300
  13. }
  14. }
  15. }

总结:Iterator可以不用管底层数据具体是怎样存储的,都能够通过next()遍历整个List

AbstractList实现Iterator的源代码

Iterator(迭代器)实现原理 - 图1