我是Java的新手,我真的很困惑迭代器和可迭代器。谁能给我解释一下并举几个例子吗?


当前回答

我知道这是一个老问题了,但是对于任何读到这篇文章的人来说,如果他们被同样的问题所困扰,并且可能被所有的术语所淹没,这里有一个很好的,简单的类比来帮助你理解迭代对象和迭代器之间的区别:

想想公共图书馆。旧的学校。用纸质书。是的,就是那种图书馆。

满满一书架的书就像一个可迭代对象。你可以看到书架上有一长排的书。你可能不知道有多少本书,但你可以看到这是一本很长的书集。

图书管理员就像迭代器一样。他可以在任何时候指出一本书。他可以在他所指向的位置插入/删除/修改/阅读书籍。每次你对着他喊“下一本!”时,他就依次指着每一本书。所以,你通常会问他:“有下一本书吗?”,他会说“有”,你说“下一本书!”,他会指向下一本书。他也知道什么时候他已经到了书架的尽头,所以当你问:“有下一个吗?”他会说“没有”。

我知道这有点傻,但我希望这能有所帮助。

其他回答

除了ColinD和Seeker的答案。

简单来说,Iterable和Iterator都是Java集合框架中提供的接口。

可迭代的

如果一个类想要有一个for-each循环来遍历它的集合,它必须实现Iterable接口。但是,for-each循环只能用于向前循环该集合,并且不能修改该集合中的元素。但是,如果您想要的只是读取元素数据,那么它就非常简单,并且由于Java lambda表达式,它通常是一行。例如:

iterableElements.forEach (x -> System.out.println(x) );

迭代器

此接口使您能够遍历集合,获取和删除其中的元素。每个集合类都提供了一个iterator()方法,该方法返回指向集合起点的迭代器。这个接口相对于iterable的优势在于,通过这个接口,您可以在集合中添加、修改或删除元素。但是,访问元素需要比iterable多一点的代码。例如:

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迭代器

基本上来说,这两者都是密切相关的。

将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

迭代器http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java

匿名类可以轻松地将Iterator转换为Iterable,并允许您使用Iterable语法(for loops, forEach())。

例如:考虑一个Iterator<T> it

for (T element : new Iterable<T>() {

    @Override
    public Iterator<T> iterator() {
        return it;
    }

}) {
    //do something with `T element`
}

抽象在函数中

static <T> Iterable<T> toIterable(Iterator<T> it) {
    return new Iterable<T>() {

        @Override
        public Iterator<T> iterator() {
            return it;
        }

    };
}

使用

for (T element: toIterable(it) {
...
}

问:Iterable和Iterator的区别? 答:

iterable:它与forEach循环相关 iterator: Is与Collection相关

forEach循环的目标元素应该是可迭代的。 我们可以使用Iterator从集合中逐个获取对象

java中存在可迭代对象。ḷang包 java中的迭代器。util包

只包含一个方法迭代器() 包含三个方法hasNext(), next(), remove()

1.5版引入 1.2版引入

如果一个集合是可迭代的,那么它可以使用迭代器迭代(因此可以在for每个循环中使用)。迭代器是遍历集合的实际对象。