关于迭代器接口的问题

Posted

技术标签:

【中文标题】关于迭代器接口的问题【英文标题】:Questions about Iterator Interface 【发布时间】:2016-01-10 04:30:18 【问题描述】:

我正在研究 Java.util 包的基本接口和类。现在接口 Set 是 Collection 和 Iterable 的子类,所以 Set 有 Iterator 模块。那么为什么我使用迭代器接口的引用呢?

    Iterator<String> iterx = x.iterator();

Iteratr 也是一个接口。但我没有看到关于 Iterable 接口和 Iterator 接口的任何关系。 Iterable 有一个名为 Iterator 的模块。写起来不会更正确

Iterable.Iterator iterx = x.iterator();

因为x.iterator调用了Set已经被Iterable继承的模块,而不是调用Iterator接口。

我有什么不明白的?

【问题讨论】:

不确定您在问什么,但您写入代码的限定类名 (java.lang.Iterable) 与继承无关。 迭代器方法(结果类型为Iterator)是实现Iterable 的类必须提供的。 【参考方案1】:

Iterable 接口表示特定的 Collection 是可迭代的,这意味着您可以使用 Iterator 对其进行迭代。

它只有一个方法,就是iterator()返回一个Iterator。任何集合,例如实现 Iterable 的 List 提供了 iterator() 方法的实现。

Iterator也是一个定义迭代过程的接口,它提供了next()、hasNext()和remove()方法,可以用来控制迭代,访问元素和删除元素。

【讨论】:

是的,但是如何将 Iterator 接口与我的对象通信? Iterator 接口和 Iterable 接口没有任何关系。 iterable 不应该调用迭代器接口吗? 像ArrayList一样创建一个内部类来实现Iterator【参考方案2】:

您使用 Iterator&lt;String&gt; 的原因与您在中使用 String 的原因相同

String stringx = x.toString()

方法(“模块”的正确名称)声明它返回一个该类型的对象。方法可以返回任何不相关的类型,你必须调整和使用它们给你的变量类型。

Iterator 在概念上与Iterable 相关,但它们不会相互继承。实际上,Iterator 授予您访问与生成它的Iterable 相同的数据的权限。

Iterator 的设计/约定是,您可以在迭代器的生命周期内迭代一次 遍历项目集合(重复hasNext()?好的,给next()!直到没有下一个。)。如果你想再次迭代,你必须得到一个新的Iterator。这就是Iterable的责任:每次你问它,它都能产生一个新鲜的Iterator

【讨论】:

以上是关于关于迭代器接口的问题的主要内容,如果未能解决你的问题,请参考以下文章

迭代器接口

java迭代器/可迭代子接口

关于可迭代对象迭代器对象生成器对象

Java中的迭代器模式

详解 迭代器 —— Iterator接口 ListIterator接口 与 并发修改异常

什么是迭代器?