18.2.5 通过实例来认识迭代器的实现

下面通过一个实例,演示如何实现Java Collection中的迭代器。

1.迭代器的代码实现

【实例18.3】迭代器模式的设计代码如下所示。


01 ///迭代器角色,仅仅定义了遍历接口

02 public interface Iterator

03 {

04 boolean hasNext();

05 Object next();

06 void remove();

07 }

08 ///容器角色,这里以List为例。它也仅仅是一个接口,就不罗列出来了

09 ///具体容器角色,是实现了List接口的ArrayList等类。为了突出重点这里只介绍和迭代器相关

10 ///的内容

11 ///具体迭代器角色,它是以内部类的形式出来的。AbstractList是为了将各个具体容器角色的公

12 ///共部分提取出来而存在的

13 public abstract class AbstractList implements List

14 {

15 ……

16 ///这个便是负责创建具体迭代器角色的工厂方法

17 public Iterator iterator(){

18 return new Itr();

19 }

20 ///作为内部类的具体迭代器角色

21 private class Itr implements Iterator

22 {

23 int cursor=0;

24 int lastRet=-1;

25 int expectedModCount=modCount;

26 public boolean hasNext()

27 {

28 return cursor!=size();

29 }

30 public Object next()

31 {

32 checkForComodification();

33 try{

34 Object next=get(cursor);

35 lastRet=cursor++;

36 return next;

37 }

38 catch(IndexOutOfBoundsException e){

39 checkForComodification();

40 throw new NoSuchElementException();

41 }

42 }

43 public void remove()

44 {

45 if(lastRet==-1)

46 throw new IllegalStateException();

47 checkForComodification();

48 try

49 {

50 AbstractList.this.remove(lastRet);

51 if(lastRet<cursor)

52 cursor—;

53 lastRet=-1;

54 expectedModCount=modCount;

55 }

56 catch(IndexOutOfBoundsException e){

57 throw new ConcurrentModificationException();

58 }

59 }

60 final void checkForComodification()

61 {

62 if(modCount!=expectedModCount)

63 throw new ConcurrentModificationException();

64 }

65 }


【代码说明】至于迭代器模式的使用,要先得到具体容器角色,然后再通过具体容器角色,得到具体迭代器角色。这样就可以使用具体迭代器角色来遍历容器。上述代码并不是完整的程序,只是演示各个角色的创建过程。

说明

本章介绍的大部分都是理论知识,主要是让读者有一个数据结构的概括知识,重要的实例都在下一章介绍。

在实现自己的迭代器时,一般要操作的容器有支持的接口才可以,而且还要注意以下问题:

❑在迭代器遍历的过程中,通过该迭代器进行容器元素的增减操作是否安全?

❑在容器中存在复合对象的情况,迭代器怎样才能支持深层遍历和多种遍历?

以上两个问题对于不同结构的容器角色,各不相同,值得考虑。

2.迭代器的适用情况

由上面的讲述可以看出,迭代器模式给容器的应用带来以下好处:

❑支持以不同的方式遍历一个容器角色,根据实现方式的不同,效果上会有差别。

❑简化了容器的接口,但是在Java Collection中为了提高可扩展性,容器还是提供了遍历的接口。

❑对同一个容器对象,可以同时进行多个遍历,因为遍历状态保存在每一个迭代器对象中。

由此得出迭代器模式的适用范围:

❑访问一个容器对象的内容而无须暴露它的内部表示。

❑支持对容器对象的多种遍历。

❑为遍历不同的容器结构提供一个统一的接口(多态迭代)。

迭代器的出现,避免了在数据结构中频繁地操作数据,同时也避免了代码的复杂性,为程序员提供了很大的方便。在实际开发的很多实例中,都将会使用到迭代器,方便程序员在数据结构中进行查询、添加、删除元素等操作。迭代器模式在现实的应用中很广泛,特别是在以后的数据库程序开发中。

学习完本章后,读者可能觉得概念还是有点模糊。没有关系,本章只是讲述数据结构的一些基本的、概念性的知识,没有涉及具体的实例。但从下一章开始,会使用实例讲解它们的具体用法,并使用实例来验证本章所讲述的知识点。