Iterable 和 Iterator 接口学习笔记

Iterable 接口在API中是这样描述的:
img
它只有一个方法:

img

Iterable.iterator()方法返回了一个Iterator,我们一般称它迭代器;

继续看 Iterator
它有三个方法:hasNext(),next(),remove();

img

迭代器是一种设计模式,它的功能是遍历并选择集合序列中的对象:
1.next():使用next()可以获得序列中的下一个元素(第一次迭代时,从第一个元素索引 0 开始);
2.hasNext():判断序列中是否还有下一个元素(比较当前迭代对象的索引和序列的 size 大小);
3.remove():将上一个迭代的元素移除并返回该元素;

Iterable 也被 Collection接口继承,实现 Iterable 接口的对象能够成为 Foreach 语句的执行对象,所以我们常用的集合类 Collection、List、Set都能使用 Foreach 遍历;

自定义一个迭代器,并使用 Foreach 迭代:

img

控制台输出:迭 代 器 测 试 类

=================分割线==================

以上是 Java 迭代器最简单的实现,并且这种迭代器只能向前移动;
如果我们希望在默认迭代器的基础上,增加一个反向迭代的功能,那么我们可以使用适配器模式,为迭代器增加一个新的能够产生 Iterable 对象的方法,这样就能够使用 Foreach 语句对其进行反向迭代了;

这里以 ArrayList 为例:

img

MyArrayList 继承自 ArrayList 类,所以最基本的正向迭代能力是支持的;
这里另外提供了一个 reversed() 方法,返回了一个 Iterable 接口;
在 Iterator 实现里,current 的值被赋为序列大小size() -1,所以next() 方法返回的是序列的最后一个元素;
同样 next() 执行之后 current 的值递减,hasNext() 判断的也是 current 是否大于 -1;

编写测试类:

img

在 Foreach 语句中,如果直接将 list 对象置于其中,将得到默认的迭代器(向前迭代);
如果调用了 reversed() 方法,得到的是我们自己编写的 Iterable 实现,执行的也是我们自己实现的 Iterator 中的方法;

控制台输出:

img

这里可以继续看一下 ArrayList 所实现的 Iterator 接口:
img

返回了自实现的 Iterator 接口;

img

可以看到,ArrayList 类实现的正是基本正向迭代,也是我们最常用的迭代方式;

明人不说暗话,如果你觉得可以的话,你懂的!