1、接口简介

iterator 是为了实现对 Java 容器(Collection)进行遍历功能的一个接口,功能较简单,且只能单向移动。

在 iterator 实现的 iterator 接口后,相当于把 Collection 容器的所有对象,做成一个线性表(list),而 iterator 本身是一个指针,开始时位于第一个元素之前。

在程序开中,经常需要遍历集合中的所有元素。针对这种需求,JDK 专门提供了一个接口 Iterator。Iterator 接口也是 Java 集合中的一员,但它与 Collection、Map 接口有所不同,Collection 接口与 Map 接口主要用存储元素,而 Iteraor 主要用于迭代访问(即遍历)Collection 中的元素,因此 Iterator 对象也被称为迭代器。
**

iterator 三个主要方法

1.1 Boolean hasNext()

判断 iterator 内下一个元素,如果存在,返回 true,否则返回 false。(此时上面的那个指针位置不变)

1.2 Object next()

返回 iterator 内下一个元素,同时上面的指针向后移动一位。所以,如果不断的执行循环 next()方法,就可以遍历容器内所有的元素了。也就是迭代。

1.3 void remove()

删除 iterator 内指针的前一个元素,前提是至少执行过一次 next()(不建议使用,建议使用容器本身的 remove 方法)。
**

2、接口意义

遍历一个 ArrayList 和 LinkLIst 是十分容易的,遍历一个 Tree 容器也不难,但是实现机制是完全不同的,而遍历一个 Set 容器就无从下手了。

所以 Java 设计了 Iterator 这个接口,分别让各种容器自己去重写里面的 hasNext()和 next()方法。

不用关心各种容器的遍历机制,只要使用 Iterator,会让人觉得,各种容器的遍历方法都是一样的,这也是 Java 接口的重要意义。
**

3、使用方法

在 Java 的各种容器中,例如 ArrayList,HashSet 等,并没有直接实现 Iterator 这个接口。

所以两个容器内是没有 hasnext()、next() 的方法的,而是 iterator() 这个方法,返回一个实现了 Iterator 接口的 iterator 对象。

4、工作原理

当迭代器遍历元素时,首先通过调用集合的 iterator()方法获得迭代器对象,然后使用 hasNext()方法判断集合中是否存在下一个元素,如果存在,则调用 next()方法将元素取出;否则说明已到达了集合末尾,停止遍历元素。需要注意的是,在通过 next()方法获取元素时,必须保证要获取的元素存在,否则,会抛出 NoSuchElementException 异常。
**

4.1、图列解释

Iterator 迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了更好的理解迭代器的工作原理,下面通过一个图例来演示 Iterator 对象迭代元素的过程。
IMG_0928(20200524-152814).JPG
如图所示,在调用 Iterator 的 next()方法之前,迭代器的索引位于第一个元素之前,不指向任何元素。当第一次调用迭代器的 next()方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回。

当再次调用 next()方法时,迭代器的索引会指向第二个元素并将该元素返回。以此类推,直到 hasNext()方法返回 false,表示到达了集合的末尾,终止对元素的遍历。

需要特别说明的是,当通过迭代器获取 ArrayList 集合中的元素时,都会将这些元素当作 Object 类型对待,如果想得到特定类型的元素,则需要进行强制类型转换(使用 ecplise 自动补全时,也是自动生成的强制类型转换,转换成 Object 类型)。

  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. public class example03 {
  4. public static void main(String[] args) {
  5. ArrayList arrayList = new ArrayList();//创建集合
  6. arrayList.add("data_1");//向集合添加元素
  7. arrayList.add("data_2");
  8. arrayList.add("data_3");
  9. arrayList.add("data_4");
  10. arrayList.add("data_5");
  11. Iterator iterator = arrayList.iterator();//获取用来遍历集合元素的iterator对象
  12. while (iterator.hasNext()) { //判断ArrayList集合中是否存在下一个元素
  13. Object object = iterator.next();//取出ArrayList集合中的元素
  14. System.out.println(object);//输出
  15. }
  16. }
  17. }
  18. console:
  19. data_1
  20. data_2
  21. data_3
  22. data_4
  23. data_5