Java中提供了很多集合类,这些集合类的数据结构不一样,因此在存储和遍历时的方式不一样。迭代器抽象出集合类的共有功能,提取判断功能和获取功能,得到接口,这个接口就是迭代器接口。在具体子类中实现迭代器接口中的若干方法(使用内部类实现这若干个方法)。接下来分析迭代器的原理和源码。
首先查看Collection接口的API。
该接口有一个父接口Iterable,该接口中有一个方法:
接口中的这个方法返回类型是Iterator类型的接口。继续查看Iterator接口。有三个方法。
因此,此时的接口体系结构如下:
在此我们可以发现,最终的子类ArrayList要实现最初的Iterable接口,即实现三个抽象方法(还有一个remove()方法)。我们接下来查看ArrayList类的源码:
首先在Iterator()方法中返回了一个 new Itr(),说明返回了一个实现类的对象。上图蓝底标记处,就是这个实现类。在此,我们得出最后的体系结构:
现在,我们可以理解,在
Collection c = new ArrayList();
Iterator it = c.iterator()
这两行代码中,第二行代码的左边是接口,右边是具体类实例对象,再转到第一行,右边是ArrayList的实例,即运行时是ArrayList的实例,因此最终返回的就是ArrayList类中的内部类Itr的实例对象。
以上就是Java迭代器的源码解析,看起来比较复杂,但是熟练地掌握了接口继承体系结果,内部类,多态(编译看左边,运行看右边)等基本知识,就可以理解迭代器这一机制的原理了。
网友评论