Iterator接口
Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。其定义如下。
|
|
下面通过ArrayList的Iterator和HashMap的Iterator来分析一下Iterator接口。
ArrayList的Iterator的源码实现
通过分析ArrayList的源码可以知道,在ArrayList内部定义了一个内部类Itr,该内部类实现Iterator接口。
|
|
对于ArrayList的迭代方法,主要是判断索引的值和数组的大小进行比较,看看还没有数据可以遍历了,然后再依次获取数组中的值,而已,主要抓住各个集合的底层实现方式即可进行迭代。
HashMap的Iterator的源码实现
在HashMap中,也有一个类实现了Iterator接口,只不过是个抽象类,HashIterator,我们来看看它的实现方式。
|
|
以上便是HashMap的Iterator的源码实现。
ListIterator接口
ListIterator是一个功能更加强大的迭代器, 它继承于Iterator接口,只能用于各种List类型的访问。可以通过调用listIterator()方法产生一个指向List开始处的ListIterator,还可以调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。以下是ListIterator接口的定义。
|
|
由以上定义可以推出ListIterator可以双向遍历,产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引,可以用set()方法来替换它访问过的最后一个元素,可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一个元素。
下面以ArrayList的ListItr为例分析ListIterator接口。
|
|
ListItr也是ArrayList的内部类,其继承于ArrayList的另一个内部类Itr并实现了ListIterator接口。可以看到ListItr是对Itr的扩展,把一个单向遍历数组扩展为双向遍历数组,并相应增加了双向遍历数组的功能。
Iterator和ListIterator的区别
Iterator和ListIterator主要区别在以下方面:
- ListIterator有add()方法,可以向List中添加对象,而Iterator不能。
- ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现顺序向前遍历,Iterator则不可以。
- ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现,Iterator没有此功能。
- 都可以删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现,Iterator仅能遍历,不能修改。
总结
数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据结构用struct来描述,在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作的方法。
在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架。
Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了,这样就大大提高了编程效率。