我在Java中新的,我真的迭代器和迭代混淆。谁能给我解释一下,给些例子吗?
一个Iterable
是一系列可以被遍历的元件的简单表示。它没有任何迭代状态,如“当前元素”。相反,它具有产生一个Iterator
一种方法。
一个Iterator
与迭代状态的对象。它可以让你检查是否有使用hasNext()
更多的元素,并移动到下一个元素(如果有的话)使用next()
。
通常,Iterable
应该能产生任何数量的有效Iterator
s的。
问:可迭代和迭代器之间的区别是什么? 答:
迭代:它关系到forEach循环 迭代器:是关系到收藏
foreach循环的目标元素shouble可迭代。 我们可以从收集使用迭代器来获取对象一个接一个
可迭代存在于java.lang包 存在于java.util包迭代
仅包含一个方法迭代器() 包含三个hasNext()方法,下一个(),删除()
在推出1.5版本 在推出1.2版本
简单来说,可迭代和Iterator是Java的集合框架提供了两个接口。
可迭代
一个类如果它想有一个for-each循环遍历其收藏来实现Iterable接口。但是,for-each循环只能通过在前进方向的收集用于循环,你将不能修改这个集合中的元素。但是,如果你想要的是读取元素的数据,那么它很简单,由于Java的lambda表达式它往往是一个衬垫。例如:
iterableElements.forEach (x -> System.out.println(x) );
迭代器
该接口使您能够遍历集合,获取和删除其元素。每个集合类的规定,返回一个迭代到集合的开始的迭代器()方法。这个接口在迭代的好处是,这个界面,你可以添加,修改或删除集合中的元素。但是,访问元素需要比迭代多一点的代码。例如:
for (Iterator i = c.iterator(); i.hasNext(); ) {
Element e = i.next(); //Get the element
System.out.println(e); //access or modify the element
}
资料来源:
Iterable
简单介绍了用于在Java中每个循环
public interface Collection<E> extends Iterable<E>
Iterator
是管理遍历所有的Iterable
类。它保持了我们在当前迭代,其中一个状态,知道下一个元素,以及如何得到它。
Iterable
的实现是一个提供自身的一个Iterator
:
public interface Iterable<T>
{
Iterator<T> iterator();
}
迭代器是允许一些遍历没有分配权限的数据集合的一个简单的方法(虽然删除能力)。
public interface Iterator<E>
{
boolean hasNext();
E next();
void remove();
}
见Javadoc。
如果集合是可迭代,则可以使用迭代迭代(并因此可以被用在每个回路。)该迭代是实际对象,将通过收集迭代。
实现可迭代接口允许一个对象是“的foreach”语句的目标。
class SomeClass implements Iterable<String> {}
class Main
{
public void method()
{
SomeClass someClass = new SomeClass();
.....
for(String s : someClass) {
//do something
}
}
}
迭代器是一个接口,其具有用于执行迭代所有元素。可迭代是提供迭代器的接口。
我会回答关于特别ArrayList中的问题,作为一个例子,以帮助您更好地了解..
public interface Iterable { ... abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T. ... }
public interface Iterator { ... abstract boolean hasNext(); //Returns true if the iteration has more elements. abstract E next(); //Returns the next element in the iteration. ... }
。而可迭代,收集和名单只是声明抽象方法“迭代器()”和ArrayList单独实现它。
“迭代()”方法返回类“ITR”它实现“迭代”的对象。
public class ArrayList<E> ... implements List<E>, ... { ... public Iterator<E> iterator() { return new Itr(); } private class Itr implements Iterator<E> { ... public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } ... } }
下面是一个简单的例子。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String string = iterator.next();
System.out.println(string);
}
}
现在,是不是清楚了吗? :)
最重要的考虑是有问题的项目是否应当能够被遍历一次以上。这是因为你总是可以通过()再次调用迭代器快退的可迭代,但没有办法退的迭代器。
考虑具有10个苹果的例子。当它实现可迭代,这就像把每个苹果在盒子从1到10,并返回可被用于导航的迭代器。
通过实施迭代,我们可以得到任何苹果,苹果在明年盒等。
因此,实现迭代给出了一个迭代器来浏览其内容虽然导航,迭代器需要实现。
从根本上说,两者是密切相关的对方。
考虑迭代器是一个接口,它可以帮助我们通过收集与一些不确定的方法,如hasNext(),未来(的帮助下穿越)和remove()
在另一面,可迭代是另一种接口,该接口,如果由类实现强制类可迭代和为目标for-each结构。它有一个来自Iterator接口本身的命名迭代只有一个方法()。
当一个集合是可迭代的,那么就可以使用迭代器迭代。
为了理解访问这些:
可迭代: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
作为解释here,在“可迭代”被引入到能够在foreach
循环使用。实现了Iterable接口的类可以遍历。
迭代器是管理遍历所有的可迭代的类。它保持了我们在当前迭代,其中一个状态,知道下一个元素,以及如何得到它。