1.前言
在面试的时候,如果面试官问你:Iterator 和 Iterable 有什么区别,你会怎么回答这个问题呢?要是一年前的我来回答这个问题的话,估计我直接就如鲠在喉、哑口无言了,不过现在的我还是能跟面试官聊上几句的,那么今天就和各位小伙伴分享一下我对 Iterator 和 Iterable 的理解。
2.Iterator 和 Iterable
定义
在聊 Iterator 和 Iterable 之前,我们得先明白二者的定义,俗话说“繁琐问题必有猥琐解法”,我们用一个“猥琐”的方式来理解二者的含义
Iterable:英语好的小伙伴应该都知道,以 able 结尾的单词,表示的含义都是【可以…】或【支持…】,那么 Iterable 所代表的含义也就是可迭代的、支持迭代的,因此我们可以知道,实现了 Iterable 接口的对象是支持迭代,是可迭代的。
Iterator:在英语中以 or 结尾的单词表示的含义是【 …样的人】或【 …者】,就像 creator 表示的是创作者的意思。那么这里也是一样的,iterator 就是迭代者,我们一般叫迭代器,它就是提供迭代机制的对象,具体如何迭代,都是 Iterator 接口来规范的。
P.S. 在 Java 设计模式中也有一种模式叫迭代器模式,Iterator 就是迭代器模式的一个应用例子
Iterable源码及方法
Iterable 源码
public interface Iterable<T> {
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
Iterator<T> iterator();
/**
* Performs the given action for each element of the {@code Iterable}
* until all elements have been processed or the action throws an
* exception. Unless otherwise specified by the implementing class,
* actions are performed in the order of iteration (if an iteration order
* is specified). Exceptions thrown by the action are relayed to the
* caller.
*
* @implSpec
* <p>The default implementation behaves as if:
* <pre>{@code
* for (T t : this)
* action.accept(t);
* }</pre>
*
* @param action The action