写在前面
在“玩”集合的时候,常用集合的迭代器(Iterator),它很方便的能遍历集合中的所有的元素
Collection<String> list = new ArrayList<String>(); list.add("aaaaaaaaa"); list.add("bbbbbbbbb"); list.add("cccccccc"); for (Iterator<String> it = list.iterator(); it.hasNext();) { String str = it.next(); System.out.println(str); } /* 或者 */ Iterator<String> it = list.iterator(); while (it.hasNext()) { String s = it.next(); System.out.println(s); }
也很容易知道Collection本身是实现的Iterable
package java.util; public interface Collection<E> extends Iterable<E> { int size(); boolean isEmpty(); boolean contains(Object o); ...... }
那么接口Iterable内部肯定有一个抽象方法
来返回一个迭代器,那么该接口中还有什么方法呢????那些方法又分别有什么用呢????Iterator<T> iterator();
接口Iterable的介绍
带着疑惑我掀起了Iteratble接口的神秘面纱
package java.lang; import java.util.Iterator; public interface Iterable<T> { Iterator<T> iterator(); }
Iterable接口内部竟然真的就只有这么一个抽象方法,而且该方法也只是返回一个Iterator迭代器,那么问题来了
为什么很多类都实现Iterable而不是实现Iterator ??
既然Iterable内部只有一个方法来返回一个Iterator迭代器,到最后还是要用Iterator(迭代器),那么为什么不让Collection(或者其他需要迭代器的接口或类)去直接实现Iterator,反而要让其实现Iterable接口呢??????
在解决这个问题前,我们先来看一下Iterator的源代码
接口Iterator的介绍
Iterator的源代码如下:
package java.util; public interface Iterator<E> { boolean hasNext(); E next(); void remove(); }
Iterator内部的 next()方法和 hasNext()方法都依赖于当前迭代的位置
一次迭代后,“指向”或者说记录当前迭代位置的“指针”,会指向该集合的末尾,
笔者认为
如果Collection实现的是Iterable的话
那么下一次再迭代的时候就需要另外写一个方法 将指针“移动到”集合的首部
即使是这样,该Collection内部也是只有一个迭代器,那么A的迭代仍然会影响B的迭代(多线程或者其他情况)
但是如果实现的是Iterable,然后在通过方法来调用迭代器的话,那么每次调用的时候产生的都是一个新的迭代器
迭代器之间互不干扰
这属于某种设计模式,但此处的重点不在设计模式上,就不做展开了,有兴趣的读者可以互相交流