Iterator和Iteratable的区别,介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Iterator和Iteratable的区别,介绍相关的知识,希望对你有一定的参考价值。

参考技术A 在java集合类库中将集合的接口与实现相分离。同样的接口,可以有不同类型的实现,这样就组成了多种不同的集合类型,他们都是实现了Collection接口,Map除外。
java集合类的基本接口是Collection接口,而Collection接口必须实现Iteratable接口,而不是Iterator这个接口。(具体原因就是他们的区别,下面会讲到)
Iteratable是接口,他和迭代器是紧密相连的,Iterator是迭代器,用来遍历集合的。集合类实现了Iterable接口后,Iterable有一个方法 Iterator<T> iterator(),调用这个方法就可以返回一个Iterator类型,然后就可以遍历集合了。
Map没有实现Iterable接口,而Map也就没有Iterator()这个方法,但是Map有keySet()和entryset()方法,这两个方法可以转成set,set有可以生成Iterator对象的方法。
Iterator 和Iterable的关系
Iterator内部有遍历集合的方法,Iterator是迭代器,之所以出现Iterator 是为了解决遍历集合时,从不同类型的集合类中抽象出来,从而避免我们在操作集合的时候必须要根据集合内部结构来选择我们应该如何遍历。
比如:假设没有Iterator,遍历一ArryList 的方法
for(int i=0;i<array.size();i++)

而如果是链表的时候必须要用While循环
while ((linkedList =linkedList.next())!=null)

比如别的类型的集合的时候可能还有有别的遍历方法。这样就造成了我们如果要遍历集合的时候必须要知道集合的内部结构,这样会使的遍历的代码和集合本身的耦合度很高!!在编程中我们应该尽量降低代码的耦合度,使代码方便日后管理,和适应需求变化。在JAVA中为了解决这个问题引入了Iterator,Iterator在遍历不同的集合的时候方式总是一样的。
想用Iterator来遍历集合,则这个集合通常要实现Iterable接口而不是Iterator,在Iterable中有一个非常重要的方法就是Iterator《T》iterator()方法,这个方法返回Iterator对象,然后通过这个对象进行遍历。
那么有人可能会产生疑问了,为什么我们不直接Implement Iterator 呢?
如果Collection直接实现Iterator这个接口的时候,则当我们new 一个新的对象的时候,这个对象中就包含了当前迭代位置的数据(指针),当这个对象在不同的方法或者类中传递的时候,当前传递的对象的迭代的位置是不可预知的,那么我们在调用next()方法的时候也就不知道是指到那一个元素。如果其中加上了一个reset()方法呢?用来重置当前迭代的位置这样Collection也只能同时存在一个当前迭代位置的对象。所有不能直接选择实现 Iterator。 实现Iteratable ,里面的方法Iterator() 可以在同一个对象每次调用的时候都产生一个新的Iterator对象。这样多个迭代器就不会互相干扰了。

根据 SE8,Iterator 和 Iterable 接口之间的区别

【中文标题】根据 SE8,Iterator 和 Iterable 接口之间的区别【英文标题】:difference between Iterator and Iterable interfaces according to SE8 【发布时间】:2016-06-27 19:56:08 【问题描述】:

我正在浏览 Java 8 的 Iterator 和 Iterable 接口的文档。请在下面找到文档的链接。我无法理解其中的区别,因为最近添加的 Iterator 的 forEachRemaining 方法似乎与 Iterable 的 forEach 方法非常相似。如果有人能帮助我理解上述方法之间的区别,以及 Iterator 和 Iterable 之间的区别以及它们在最新版本 java 8 中各自的用途,我将不胜感激。

Iterator

Iterable

【问题讨论】:

你检查过默认实现吗?它应该向您显示路径.../ Iterable 是一个集合,您可以从中创建一个迭代器。它并不比这复杂得多。正如您所提到的,存在细微的差异,但这已包含在文档中。 【参考方案1】:

forEachRemaining() 将对使用方法next() 从当前Iterator 的状态 可以到达的所有元素应用一个操作。forEach() 将应用一个对Iterable 的所有元素执行操作。

如果您在尚未调用next()Iterator 上使用forEachRemaining(),它们具有相同的效果。 但是,您可以使用 next() 开始迭代,直到达到特定条件,然后使用 forEachRemaining()Iterable 的其余部分应用操作。

【讨论】:

【参考方案2】:

查看接口的文档时,您应该主要关注不是default 的方法,因为默认方法只是使用其他非默认方法实现的方法。

如果你只考虑非默认方法,你就会意识到 Iterable 是一个类,它有一个 iterator() 方法返回一个 Iterator。例如:Collection 就是这样一个类:每个集合都可以使用它提供的 Iterator 进行迭代,并且能够遍历该集合。

默认方法只是在从 Iterable 中获取 Iterator 的能力之上实现的。

forEach() 将迭代器从 Iterable 中取出,并为 iterable 的每个元素做一些事情

forEachRemaining() 对迭代器的所有 剩余 元素执行某些操作(因为在调用 forEachRemaining() 之前,您可能已经在迭代器上调用了多次 next())。但是,是的,这两个人非常接近。一个显着的区别是,对于大多数可迭代对象,您可以多次调用 forEach(),并且会多次通过元素。相反,forEachRemaining() 消耗迭代器的所有元素,并且第二次调用它不会做任何事情,因为不再有下一个元素。

【讨论】:

以上是关于Iterator和Iteratable的区别,介绍的主要内容,如果未能解决你的问题,请参考以下文章

IteratorIteratable与ListIterator

Python学习之高阶函数——map/reduce

iterator和generator之间的区别是啥

JDK源码Iterator与Iterable的实现与区别

JDK源码Iterator与Iterable的实现与区别

Iterator和Iterator<E>啥区别