Java 迭代器是一个对象,它在一个序列中单向移动并可操作该序列中的每个元素对象。

1 基本用法
除了单向移动这个特性之外,还包含了获取、检查与移除元素的 API 方法。

有了这些 API 方法,我们就可以迭代集合中的元素。

代码示例中,首先通过 iterator() 方法返回迭代器对象,然后检查、获取集合中的元素。
如果需要修改集合中的元素,那么可以先调用 next(),然后再修改这个元素。


如果只是想遍历 List ,并不打算修改或删除 List 对象中的元素,那么使用 for-in 语法会让代码看上去更加简洁。

2 反向遍历
除了传统的正向遍历之外,使用 ListIterator 还可以支持反向遍历。

ListIterator 提供了用于反向遍历的 API,比如获取、检查上一个元素,返回上一元素检索值等等:

利用这些 API 方法就可以实现前向或后向遍历咯:

3 for-in 语法
for-in 语法主要用于数组,但也可用于任何 Collection 对象,因为它们实现了 Iterable 接口。

Iterable 接口包含了一个能够生成 Iterator 的 iterator() 方法。for-in 语句就是使用这个 Iterable 接口来遍历序列。所以,任何实现了 Iterable 接口的类,都可以用于 for-in 语句。
Bruce Eckel 举了这样一个示例,来说明自定义的 Iterable 接口的类可以用于 for-in 语句:


通过实现不同规则的 Iterable,就可以定义不同的迭代规则。
逆序规则:

随机规则:

4 Iterator和Iterable的区别
Iterator是迭代器对象,是集合进行迭代遍历的底层依赖。而Iterable接口内部定义了返回Iterator对象的方法,实际上封装了 Iterator对象。
下面这段是Iterable接口的定义源代码:

为何不直接将hasNext(),next()方法等遍历方法设计在Iterable接口中?
因为有些集合类可能需要多种遍历方式,比如 LinkedList 就设计了 ListItr 与 DescendingIterator 方法分别用于实现双向遍历和逆序遍历。