我刚刚了解了Java Collections Framework如何在链表中实现数据结构.根据我的理解,这Iterators
是一种遍历数据结构(如列表)中的项目的方法.为什么使用这个界面?为什么这些方法hasNext()
,next()
而remove()
不是直接编码到数据结构实现本身?
从Java网站:链接文本
public interface Iterator
集合上的迭代器.Iterator取代了Java集合框架中的Enumeration.迭代器在两个方面与枚举不同:
迭代器允许调用者在迭代期间使用定义良好的语义从底层集合中删除元素.
方法名称已得到改进.
此接口是Java Collections Framework的成员.
我试着用Google搜索,似乎无法找到明确的答案.有人可以解释为什么Sun选择使用它们吗?是因为更好的设计?增加安全性?好的OO练习?
任何帮助将不胜感激.谢谢.
为什么使用这个界面?
由于它支持,将允许客户端程序员的任何类型的集合遍历的基本操作(注意:不一定是Collection
在Object
意义上).
为什么方法......没有直接编码到数据结构实现本身?
他们是,他们只是标记为私人,所以你无法进入他们并与他们捣乱.进一步来说:
您可以实现或子类化Iterator
,使其执行标准不执行的操作,而不必更改它迭代的实际对象.
可以遍历的对象不需要使用遍历方法使其接口混乱,特别是任何高度专业化的方法.
您可以Iterators
分发您想要的许多客户,并且每个客户可以按照自己的速度在自己的时间内进行遍历.
Iterators
特别是java.util包中的Java 会抛出异常,如果在你还没有Iterator
输出时修改了支持它们的存储.此异常会让您知道Iterator
现在可能正在返回无效对象.
对于简单的程序,这些似乎都不值得.然而,那种使它们变得有用的复杂性将很快出现在你身上.
你问:"为什么方法hasNext(),next()和remove()没有直接编码到数据结构实现本身?".
Java Collections框架选择将Iterator接口定义为集合本身的外部化.通常,由于每个Java集合都实现了Iterable
接口,因此Java程序将调用它iterator
来创建自己的迭代器,以便可以在循环中使用它.正如其他人所指出的那样,Java 5允许我们使用for-each循环来指导迭代器的使用.
将迭代器外部化到其集合允许客户端控制迭代集合的方式.我可以想到一个有用的用例是当一个人有一个无限的集合,比如互联网上的所有网页都要编制索引.
在经典的GoF书中,内部和外部迭代器之间的对比非常明确.
一个基本问题是决定哪一方控制迭代,迭代器或使用迭代器的客户端.当客户端控制迭代时,迭代器被称为外部迭代器,当迭代器控制它时,迭代器是一个内部迭代器.使用外部迭代器的客户端必须推进遍历并从迭代器显式请求下一个元素.相反,客户端向内部迭代器提供要执行的操作,迭代器将该操作应用于每个元素....
外部迭代器比内部迭代器更灵活.例如,将两个集合与外部迭代器进行相等比较很容易,但内部迭代器实际上是不可能的......但另一方面,内部迭代器更容易使用,因为它们为您定义了迭代逻辑.
有关内部迭代器如何工作的示例,请参阅Ruby的Enumerable
API,它具有内部迭代方法,如each
.在Ruby中,我们的想法是将一个代码块(即一个闭包)传递给内部迭代器,以便集合可以处理自己的迭代.