Java 中的迭代器接口有哪些好处?

2022-09-01 06:08:09

我刚刚了解了Java集合框架如何在链接列表中实现数据结构。据我所知,这是一种遍历数据结构(如列表)中的项的方法。为什么使用此接口?为什么是方法,而不是直接编码到数据结构实现本身?IteratorshasNext()next()remove()

来自 Java 网站:链接文本

公共接口迭代器<E>

集合上的迭代器。迭代器取代了 Java 集合框架中的枚举。迭代器在两个方面与枚举不同:

  • 迭代器允许调用方在迭代期间使用明确定义的语义从基础集合中删除元素。
  • 方法名称已得到改进。
此接口是 Java 集合框架的成员。

我尝试在谷歌上搜索,似乎找不到明确的答案。有人能解释一下为什么Sun选择使用它们吗?是因为更好的设计吗?提高安全性?良好的OO实践?

任何帮助将不胜感激。谢谢。


答案 1

为什么使用此接口?

因为它支持允许客户端程序员迭代任何类型的集合的基本操作(注意:不一定是某种意义上的集合)。CollectionObject

为什么这些方法...没有直接编码到数据结构实现本身?

他们是,他们只是被标记为私人,所以你不能伸手进入他们并与他们混在一起。更具体地说:

  • 您可以实现或子类化一个,以便它执行标准对象不执行的操作,而不必更改它迭代的实际对象。Iterator
  • 可以遍历的对象不需要让它们的接口与遍历方法混淆,特别是任何高度专业化的方法。
  • 您可以分发给您希望的任何数量的客户,并且每个客户都可以在自己的时间,以自己的速度进行遍历。Iterators
  • 特别是来自 java.util 包的 Java,如果在您仍然外出时修改了支持它们的存储,则会引发异常。此异常让您知道 现在可能返回无效对象。IteratorsIteratorIterator

对于简单的程序,这些似乎都不值得。不过,使它们有用的那种复杂性很快就会出现在你身上。


答案 2

你问:“为什么方法 hasNext()、next() 和 remove() 没有直接编码到数据结构实现本身?

Java 集合框架选择将迭代器接口定义为外部化到集合本身。通常,由于每个 Java 集合都实现了该接口,因此 Java 程序将调用以创建自己的迭代器,以便可以在循环中使用它。正如其他人所指出的,Java 5允许我们直接使用迭代器,每个循环。Iterableiterator

通过将迭代器外部化到其集合中,客户端可以控制如何循环访问集合。我能想到的一个用例是,当一个人有一个无限的集合时,例如Internet上的所有网页都要索引。

在经典的GoF书中,内部和外部迭代器之间的对比被清楚地阐明了。

一个基本问题是决定哪一方注册迭代,迭代器或使用迭代器的客户端。当客户端控制迭代时,迭代器称为外部迭代器,当迭代器控制它时,迭代器是内部迭代器。使用外部迭代器的客户端必须推进遍历,并从迭代器显式请求下一个元素。相反,客户端向内部迭代器提供要执行的操作,迭代器将该操作应用于每个元素....

外部迭代器比内部迭代器更灵活。例如,使用外部迭代器比较两个集合的相等性很容易,但是使用内部迭代器几乎是不可能的......但另一方面,内部迭代器更易于使用,因为它们为您定义了迭代逻辑。

有关内部迭代器如何工作的示例,请参阅 Ruby 的 API,它具有内部迭代方法,例如 。在Ruby中,这个想法是将一个代码块(即闭包)传递给内部迭代器,以便集合可以处理自己的迭代。Enumerableeach