迭代器和迭代之间有什么区别以及如何使用它们?

时间:2011-07-28 17:35:08

标签: java iterator iterable

我是Java的新手,我真的很困惑迭代器和迭代。任何人都可以向我解释并举一些例子吗?

13 个答案:

答案 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的例子,以帮助您更好地理解..

  1. Iterable接口强制其子类实现抽象方法'iterator()'。
  2. public interface Iterable {
      ...
      abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
      ...
    }
    
    1. Iterator接口强制其子类实现抽象方法'hasNext()'和'next()'。
    2. public interface Iterator {
        ...
        abstract boolean hasNext(); //Returns true if the iteration has more elements.
        abstract E next();          //Returns the next element in the iteration.
        ...
      }
      
      1. ArrayList实现List,List实现Collection和Collection实现Iterable .. 也就是说,你可以看到这样的关系
          

        'Iterable&lt; - Collection&lt; - List&lt; - ArrayList'

      2. 。 Iterable,Collection和List只是声明抽象方法'iterator()',而ArrayList单独实现它。

        1. 我将使用'iterator()'方法显示ArrayList源代码,如下所示,以获取更多详细信息。
        2. '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];
                    }
                    ...
            }
          }
          
          1. 其他一些方法或类将通过使用Iterator(Itr)迭代像ArrayList这样的集合元素。
          2.   

            这是一个简单的例子。

            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)

ColinDSeeker个答案外。

简单来说, 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) );

<强>来源:

  1. Java Doc Iterable
  2. Java Doc Iterator

答案 12 :(得分:0)

引入了

Iterable,用于Java中的每个循环

public interface Collection<E> extends Iterable<E>  

Iterator是管理Iterable上的迭代的类。它保持当前迭代中我们所处的状态,并且知道下一个元素是什么以及如何获取它。