18.2.4 Iterator迭代器接口

Iterator是一个集合的迭代器,通过Iterator访问接口而不用关心集合的实现。Iterator接口中定义了三个方法:

❑hasNext():是否还有下一个元素。

❑next():返回下一个元素。

❑remove():删除当前元素。

那什么是迭代器呢?迭代器指向两个元素中间的位置,当调用hasnext()方法时,如果返回true,此时调用next()方法返回下一元素。迭代器指向下两个元素之间的位置,如果要删除下一个元素,必须先next(),再remove()。

1.迭代器的作用

有些类没有提供get操作,可用迭代器来获得信息。所有Collection接口的子类、子接口都支持Iterator迭代器。

迭代器(Iterator)模式,又称为游标(Cursor)模式。下面给出它的官方定义:提供一种方法访问一个容器(Container)对象中各个元素,而又不需暴露该对象的内部细节,这就是迭代器。

从定义可见,迭代器模式是为容器而生。为了能够在容器内实现遍历,曾经有很多人提出过多种方法。有的认为,对容器对象的访问必然涉及遍历算法,可以将遍历方法塞到容器对象中。有的认为,或者根本不去提供什么遍历算法,让使用容器的人自己去实现。这两种情况好像都能够解决问题。

然而在前一种情况中,容器承受了过多的功能。它不仅要负责自己“容器”内的元素维护(添加、删除等),而且还要提供遍历自身的接口。由于遍历状态保存的问题,不能对一个容器对象同时进行多个遍历。第二种情况却又将容器的内部细节暴露无遗。

而迭代器模式的出现,很好地解决了上面两种情况的弊端。下面详细地介绍迭代器模式。

2.迭代器模式

迭代器模式由以下角色组成:

❑迭代器角色(Iterator):负责定义访问和遍历元素的接口。

❑具体迭代器角色(Concrete Iterator):实现迭代器接口,并记录遍历中的当前位置。

❑容器角色(Container):负责提供创建具体迭代器角色的接口。

❑具体容器角色(Concrete Container):实现创建具体迭代器角色的接口—这个具体迭代器角色与该容器的结构相关。

下面列举迭代器模式的实现方式。

❑迭代器角色定义了遍历的接口,但是没有规定由谁来控制迭代。在Java Collection的应用中,由客户程序来控制遍历的进程,被称为外部迭代器。还有一种实现方式是由迭代器自身来控制迭代,被称为内部迭代器。外部迭代器要比内部迭代器灵活、强大,而且内部迭代器在Java环境中,可用性很弱。

❑在迭代器模式中,没有规定谁来实现遍历算法。因为既可以在一个容器上使用不同的遍历算法,也可以将一种遍历算法应用于不同的容器。这样就破坏了容器的封装—容器角色就要公开自己的私有属性。在Java中意味着向其他类公开了自己的私有属性。那把它放入容器角色里实现,这样迭代器角色就被架空,仅仅具备存放一个遍历当前位置的功能,但是遍历算法和特定的容器紧紧绑在一起。而在Java Collection的应用中,提供的具体迭代器角色是定义在容器角色中的内部类,这样便保护了容器的封装。同时容器也提供遍历算法接口,用户可以扩展自己的迭代器。