我是Java的新手,我真的很困惑迭代器和迭代。任何人都可以向我解释并举一些例子吗?
答案 0 :(得分:167)
Iterable
是可以迭代的一系列元素的简单表示。它没有任何迭代状态,例如“当前元素”。相反,它有一个产生Iterator
的方法。
Iterator
是具有迭代状态的对象。它允许您使用hasNext()
检查其是否包含更多元素,并使用next()
移至下一个元素(如果有)。
通常,Iterable
应该能够生成任意数量的有效Iterator
。
答案 1 :(得分:79)
Iterable
的实现是提供Iterator
自身的实现:
public interface Iterable<T>
{
Iterator<T> iterator();
}
迭代器是一种简单的方法,允许一些人在没有赋值权限的情况下循环访问数据集合(虽然能够删除)。
public interface Iterator<E>
{
boolean hasNext();
E next();
void remove();
}
请参阅Javadoc。
答案 2 :(得分:11)
如果一个集合是可迭代的,那么它可以使用迭代器进行迭代(因此可以在每个循环中使用它。)迭代器是迭代整个集合的实际对象。
答案 3 :(得分:8)
实现Iterable接口允许对象成为“foreach”语句的目标。
class SomeClass implements Iterable<String> {}
class Main
{
public void method()
{
SomeClass someClass = new SomeClass();
.....
for(String s : someClass) {
//do something
}
}
}
Iterator是一个接口,它具有迭代元素的实现。 Iterable是一个提供Iterator的接口。
答案 4 :(得分:6)
我将回答这个问题,特别是关于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. ... }
'Iterable&lt; - Collection&lt; - List&lt; - ArrayList'
。 Iterable,Collection和List只是声明抽象方法'iterator()',而ArrayList单独实现它。
'iterator()'方法返回一个实现'Iterator'的类'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);
}
}
现在,它清楚了吗? :)
答案 5 :(得分:5)
最重要的考虑因素是该项目是否应该能够多次遍历。这是因为你总是可以通过再次调用iterator()来回绕Iterable,但是没有办法倒回迭代器。
答案 6 :(得分:3)
我知道这是一个古老的问题,但是对于所有阅读此问题的人来说,如果遇到同样的问题并且可能对所有术语不知所措,以下是一个很好的简单类比,可以帮助您理解可迭代和迭代器之间的区别:
想想公共图书馆。老套。与纸质书。是的,那种图书馆。
一个装满书架的书架就像是一个可重复的书架。您可以在书架上看到长行的书。您可能不知道有多少本,但是您会看到它是一本很长的书。
图书馆员就像迭代器。他可以随时指向特定的书。他可以在他所指向的位置插入/删除/修改/阅读这本书。每当您大喊“下一个!”时,他都会依次指向每本书。给他。因此,您通常会问他:“还有吗?”,他会说“是”,然后您说“下一步!”。他将指向下一本书。他还知道何时到达架子的尽头,因此当您问:“下一个吗?”他会说“不”。
我知道这有点傻,但是我希望这会有所帮助。
答案 7 :(得分:2)
考虑一个有10个苹果的例子。 当它实现Iterable时,就像将每个苹果放在1到10的方框中并返回一个可用于导航的迭代器。
通过实现迭代器,我们可以在下一个盒子中获得任何苹果,苹果等。
因此实现iterable提供了一个迭代器来导航它的元素,虽然要导航,迭代器需要实现。
答案 8 :(得分:1)
基本上讲,两者都非常密切相关。
将 Iterator 视为一个界面,它可以帮助我们借助一些未定义的方法遍历集合,例如 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
答案 9 :(得分:1)
正如here所述,引入了“ Iterable ”以便能够在MyARViewController
循环中使用。可以迭代实现 Iterable 接口的类。
Iterator是管理 Iterable 上的迭代的类。它保持我们在当前迭代中的状态,并知道下一个元素是什么以及如何获取它。
答案 10 :(得分:0)
问题:Iterable和Iterator之间的区别?
答:
iterable:它与forEach循环有关 iterator:与Collection
有关 forEach循环的目标元素是可迭代的。
我们可以使用Iterator从Collection
java.ḷang包中的可重复存在 Iterator存在于java.util包中
只包含一个方法iterator()
包含三个方法hasNext(),next(),remove()
引入1.5版本 在1.2版本中引入
答案 11 :(得分:0)
简单来说, Iterable 和 Iterator 都是Java的Collection Framework中提供的接口。
<强>可迭代强>
如果一个类想要有一个 for-each 循环来迭代它的集合,那么它必须实现Iterable接口。但是, for-each循环只能用于向前循环收集,并且您无法修改此集合中的元素。但是,如果你想要的只是阅读元素数据,那么它非常简单,而且由于Java lambda表达式,它通常是一个衬里。例如:
<tizen:privilege name="http://tizen.org/privilege/location"/>
<tizen:privilege name="http://tizen.org/privilege/application.launch"/>
<强>迭代强>
此界面使您可以迭代集合,获取和删除其元素。每个集合类都提供了一个 iterator()方法,该方法将迭代器返回到集合的开头。此接口优于iterable的优点是,使用此接口,您可以添加,修改或删除集合中的元素。但是,访问元素需要比迭代更多的代码。例如:
iterableElements.forEach (x -> System.out.println(x) );
<强>来源:强>
答案 12 :(得分:0)
Iterable
,用于Java中的每个循环
public interface Collection<E> extends Iterable<E>
Iterator
是管理Iterable
上的迭代的类。它保持当前迭代中我们所处的状态,并且知道下一个元素是什么以及如何获取它。