|
|
|
|
移动端

3.3.2 Iterator接口

《数据结构与算法分析:Java语言描述(原书第3版)》第3章表、栈和队列,本章讨论最简单和最基本的三种数据结构。实际上, 每一个有意义的程序都将显式地至少使用一种这样的数据结构, 而栈则在程序中总是要被间接地用到, 不管我们在程序中是否做了声明。本节为大家介绍Iterator接口。

作者:冯舜玺/陈越 译来源:机械工业出版社|2016-04-13 12:04

有奖调研 | 1TB硬盘等你拿 AI+区块链的发展趋势及应用调研


3.3.2 Iterator接口

实现Iterable接口的集合必须提供一个称为iterator的方法, 该方法返回一个Iterator类型的对象。该Iterator是一个在java.util包中定义的接口, 见图3-7。

Iterator接口的思路是, 通过iterator方法, 每个集合均可创建并返回给客户一个实现Iterator接口的对象, 并将当前位置的概念在对象内部存储下来。

每次对next的调用都给出集合的(尚未见到的)下一项。因此, 第1次调用next给出第1项, 第2次调用给出第2项, 等等。hasNext用来告诉是否存在下一项。当编译器见到一个正在用于Iterable的对象的增强的for循环的时候, 它用对iterator方法的那些调用代替增强的for循环以得到一个Iterator对象, 然后调用next和hasNext。因此, 前面看到的print例程由编译器重写, 见图3-8所示。

由于Iterator接口中的现有方法有限, 因此, 很难使用Iterator做简单遍历Collection以外的任何工作。Iterator接口还包含一个方法, 叫作remove。该方法可以删除由next最新返回的项(此后, 62我们不能再调用remove, 直到对next再一次调用以后)。虽然Collection接口也包含一个remove方法, 但是, 使用Iterator 的remove方法可能有更多的优点。

Iterator的remove方法的主要优点在于, Collection的remove方法必须首先找出要被删除的项。如果知道所要删除的项的准确位置, 那么删除它的开销很可能要小得多。下一节我们将要看到一个例子, 是在集合中每隔一项删除一项。这个程序用迭代器(iterator)很容易编写, 而且比用Collection的remove方法潜藏着更高的效率。

当直接使用Iterator(而不是通过一个增强的for循环间接使用)时, 重要的是要记住一个基本法则: 如果对正在被迭代的集合进行结构上的改变(即对该集合使用add、 remove或clear方法), 那么迭代器就不再合法(并且在其后使用该迭代器时将会有Concurrent-ModificationException异常被抛出)。为避免迭代器准备给出某一项作为下一项(next item)而该项此后或者被删除, 或者也许一个新的项正好插入该项的前面这样一些讨厌的情形, 有必要记住上述法则。这意味着, 只有在需要立即使用一个迭代器的时候, 我们才应该获取迭代器。然而, 如果迭代器调用了它自己的remove方法, 那么这个迭代器就仍然是合法的。这是有时候我们更愿意使用迭代器的remove方法的第二个原因。


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:342347198

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

ASP网络编程从入门到精通

本书是为那些对Web开发感兴趣的读者而编写的。ASP(Active Server Pages)是微软公司在Web领域的又一次突破,它打破了以往只能由专业人员来...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊