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 对象迭代元素的过程。
如图所示,在调用 Iterator 的 next()方法之前,迭代器的索引位于第一个元素之前,不指向任何元素。当第一次调用迭代器的 next()方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回。
当再次调用 next()方法时,迭代器的索引会指向第二个元素并将该元素返回。以此类推,直到 hasNext()方法返回 false,表示到达了集合的末尾,终止对元素的遍历。
需要特别说明的是,当通过迭代器获取 ArrayList 集合中的元素时,都会将这些元素当作 Object 类型对待,如果想得到特定类型的元素,则需要进行强制类型转换(使用 ecplise 自动补全时,也是自动生成的强制类型转换,转换成 Object 类型)。
import java.util.ArrayList;
import java.util.Iterator;
public class example03 {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();//创建集合
arrayList.add("data_1");//向集合添加元素
arrayList.add("data_2");
arrayList.add("data_3");
arrayList.add("data_4");
arrayList.add("data_5");
Iterator iterator = arrayList.iterator();//获取用来遍历集合元素的iterator对象
while (iterator.hasNext()) { //判断ArrayList集合中是否存在下一个元素
Object object = iterator.next();//取出ArrayList集合中的元素
System.out.println(object);//输出
}
}
}
console:
data_1
data_2
data_3
data_4
data_5