Iterable:顾名思义,实现了这个接口的对象支持迭代,是可迭代的。
Iterator:同样,这是迭代器,它就是提供迭代机制的对象,具体如何迭代,都有Iterator规范的。
迭代器是一种模式,它能够使序列类型的数据结构的遍历行为与被便利的对象本省分离,即当我们遍历时不需要关心数据结构的具体底层结构。只要拿到这个对象,使用迭代器便可以对这个对象进行遍历。
1)Iterator
java提供了一个迭代器接口,我们通过实现这个接口来提供标准的迭代器:
其中JDK文档里面的接口定义为下:
1 Package java.util;
2 public interface Iterator<E> {
3 boolean hasNext();
4 E next();
5 void remove();
6 }
2)Iterable
java同样提供了一个Iterable接口,其作用在于返回一个实现了Iterator接口的对象。实现这个接口允许对象成为foreach语句的目标,然后就可以通过foreach语句对序列进行遍历。
它的JDK文档定义为:
1 package java.lang;
2
3 public interface Iterable<AnyType>
4 {
5 Iterator<AnyType> iterator();
6 }
ps:为什么在不同的包里面啊。很困惑,希望有好心人能够解答一下。
这里有个很简单的关于Iterable的应用:
package iteratorTest;
import java.util.*;
public class TestIterator {
public static void main(String[] args){
List list=new ArrayList();
Map map=new HashMap();
for(int i=0;i<10;i++){
list.add("list"+i);
map.put(i,"map"+i);
}
Iterator it=list.iterator();
while(it.hasNext()){
String strList=(String) it.next();
System.out.println(strList);
}
Iterator it2=map.entrySet().iterator();
while(it2.hasNext()){
Map.Entry strMap=(Map.Entry)it2.next();
System.out.println(strMap.getValue());
}
}
}
这个时候,我们会开始讨论for,foreach,迭代器之间的区别和实现原理。
其中最重要的就是,使用迭代器进行遍历的时候,可以进行remove()操作,而在foreach和for里面,使用remove()操作会抛出异常。
当然区别不知这一点。这其实时一个深渊巨坑,因为在探讨抛出异常的时候,会讨论到iterator具体的接口对象是谁,然后我就去看jdk的源码,首先以arraylist为例子将整个arraylist和iterator相关的,和对arraylist进行改变时候的的modcount参数进行了解。然后发现不同的接口对象实现过程是不同的。
我将会在下一篇文章来探讨这个问题,其中包括了在我学习三种遍历方法的时候遇到的一些问题和源码中问题是怎么产生的。并以arraylist为例子,将整个iterator遍历过程进行一遍梳理。