迭代器和迭代器有什么区别,以及如何使用它们?
我是新来的Java,我真的很困惑迭代器和迭代。 任何人都可以解释给我一些例子吗?
Iterable
是可以迭代的一系列元素的简单表示。 它没有任何迭代状态,如“当前元素”。 相反,它有一个生成Iterator
方法。
Iterator
是具有迭代状态的对象。 它可以让你检查使用hasNext()
是否有更多的元素,并使用hasNext()
移动到下一个元素(如果有的话next()
。
通常, Iterable
应该能够生成任意数量的有效Iterator
。
Iterable
的实现是提供自身的Iterator
:
public interface Iterable<T> { Iterator<T> iterator(); }
迭代器是一种简单的方法,允许一些人在没有赋值权限的情况下循环访问数据(尽pipe能够删除)。
public interface Iterator<E> { boolean hasNext(); E next(); void remove(); }
见Javadoc 。
Iterable:可迭代的类。 也就是说,在我们用完之前,有一个“先让我先做事,再做下一件事,等等”的概念。
迭代器:一个pipe理迭代的迭代的类。 也就是说,它会跟踪我们在当前迭代中的位置,并知道下一个元素是什么以及如何获得它。
为了使一个对象可迭代,它需要发出一个Iterator
对象。 为了执行这个合同,将使用Iterable接口。 它包含一个名为iterator()的方法,它返回Iterator。 因此,任何实现Iterable的类都将返回一个Iterator。
public interface Collection<E> extends Iterable<E> {}
例如采取任何集合。 Collection是一个接口,表示一系列元素的容器。 像ArrayList,Vector的每个集合都实现Collection和Iterator。
Iterable的一个优点是,当你实现Iterable的时候,那些对象得到for:for each循环语法的支持。
如果一个集合是可迭代的,那么它可以使用一个迭代器进行迭代(因此可以在每个循环中使用)。迭代器是将在集合中迭代的实际对象。
实现Iterable接口允许一个对象成为“foreach”语句的目标。
class SomeClass implements Iterable<String> {} class Main { public void method() { SomeClass someClass = new SomeClass(); ..... for(String s : someClass) { //do something } } }
迭代器是一个接口,它具有迭代元素的实现。 Iterable是一个提供Iterator的接口。
最重要的考虑是所涉及的项目是否应该能够被遍历多次。 这是因为你总是可以通过再次调用iterator()来倒回一个Iterable,但是没有办法倒回一个Iterator。
考虑一个有10个苹果的例子。 当它实现Iterable时,就像将每个苹果放在1到10的方框中,并返回一个可用于导航的迭代器。
通过实现迭代器,我们可以得到任何苹果,苹果在下一个盒子等。
因此,实现迭代给出了一个迭代器来浏览其元素虽然要导航,迭代器需要实现..
问题:Iterable和Iterator之间的区别?
答:
迭代:与forEach循环有关
迭代器:是与Collection相关的
forEach循环的目标元素是可迭代的。
我们可以使用Iterator从Collection中逐一获取对象
java.lang包中的可重用存在
Iterator存在于java.util包中
只包含一个方法iterator()
包含三个方法hasNext(),next(),remove()
在1.5版本中引入
在1.2版本中引入
除了ColinD和Seeker的答案。
简而言之, Iterable和Iterator都是在Java的Collection Framework中提供的接口。
可迭代
一个类必须实现Iterable接口,如果它想有一个for-each循环遍历它的集合。 但是, for-each循环只能用于循环正向的集合,并且不能修改此集合中的元素 。 但是,如果您只想读取元素数据,那么这非常简单,并且感谢Java lambdaexpression式,它通常是一个class轮。 例如:
iterableElements.forEach (x -> System.out.println(x) );
迭代器
这个接口可以让你迭代一个集合,获取和删除它的元素。 每个集合类都提供了一个将迭代器返回到集合起始处的iterator()方法。 这个接口的优点是可以通过这个接口添加,修改或删除集合中的元素 。 但是,访问元素需要比可迭代多一点的代码。 例如:
for (Iterator i = c.iterator(); i.hasNext(); ) { Element e = i.next(); //Get the element System.out.println(e); //access or modify the element }
资料来源:
- Java Doc Iterable
- Java Doc迭代器
基本上讲,他们俩都是非常密切相关的。
考虑迭代器是一个接口,它可以帮助我们在hasNext(),next()和remove()等一些未定义的方法的帮助下遍历一个集合。
另一方面, Iterable是另一个接口,如果由一个类实现,则该类迫使该类成为Iterable,并成为For-Each构造的目标。 它只有一个名为iterator()的方法来自Iterator接口本身。
当一个集合是可迭代的,那么它可以迭代器迭代。
为了理解访问这些:
ITERABLE: http ://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java
ITERATOR http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java
正如这里所解释的,“ Iterable ”被引入可以在foreach
循环中使用。 一个实现Iterable接口的类可以被迭代。
Iterator是pipe理Iterable迭代的类。 它保持了我们在当前迭代中的状态,并知道下一个元素是什么以及如何获得它。