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

Cha*_*Cai 178 java iterator iterable

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

Col*_*inD 183

An Iterable是可以迭代的一系列元素的简单表示.它没有任何迭代状态,例如"当前元素".相反,它有一个产生一个的方法Iterator.

An Iterator是具有迭代状态的对象.它允许您检查是否有更多元素使用hasNext()并移动到下一个元素(如果有)使用next().

通常,Iterable应该能够产生任意数量的有效Iterators.


Kei*_*son 86

实现Iterable是一个提供Iterator自身的实现:

public interface Iterable<T>
{
    Iterator<T> iterator();
}
Run Code Online (Sandbox Code Playgroud)

迭代器是一种简单的方法,允许一些人在没有赋值权限的情况下循环访问数据集合(虽然能够删除).

public interface Iterator<E>
{
    boolean hasNext();
    E next();
    void remove();
}
Run Code Online (Sandbox Code Playgroud)

Javadoc.


dle*_*lev 12

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

  • 仅供参考,java.util.Collection始终实现java.util.Iterable. (2认同)
  • 它不是`java.lang.Iterable`吗? (2认同)

JAM*_*ANG 11

我将回答这个问题,特别是关于ArrayList的例子,以帮助您更好地理解..

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

    'Iterable < - Collection < - List < - ArrayList'

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

  1. 我将使用'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];
          }
          ...
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 其他一些方法或类将通过使用Iterator(Itr)迭代集合的元素,如ArrayList.

这是一个简单的例子.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,它清楚了吗?:)


小智 10

我知道这是一个古老的问题,但是对于任何读这个的人来说,他们遇到了同样的问题并且可能对所有术语感到不知所措,这里有一个很好的简单类比,可以帮助您理解迭代器和迭代器之间的区别:

想想公共图书馆。老套。用纸书。是的,那种图书馆。

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

图书管理员就像迭代器。他可以随时指向特定的书。他可以在他所指的那个位置插入/移除/修改/阅读这本书。每次你大喊“下一本!”时,他都会依次指向每本书。给他。所以,你通常会问他:“有下一个吗?”,他会说“是”,你说“下一个!” 他会指向下一本书。他也知道他什么时候到了架子的尽头,所以当你问:“有下一个吗?” 他会说“不”。

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


Nag*_*ran 9

实现Iterable接口允许对象成为"foreach"语句的目标.

class SomeClass implements Iterable<String> {}

class Main 
{
  public void method()
  {
     SomeClass someClass = new SomeClass();
     .....

    for(String s : someClass) {
     //do something
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Iterator是一个接口,它具有迭代元素的实现.Iterable是一个提供Iterator的接口.


Pra*_*hor 6

最重要的考虑因素是所讨论的项目是否应该能够被多次遍历。这是因为您始终可以通过再次调用iterator()来回退Iterable,但是无法回退Iterator。

  • 我想知道为什么集合类不直接实现 Iterator 接口(而不是实现 Iterable 并返回 Iterator 对象)。这个答案清楚地表明 - 在这种情况下,不可能多次遍历集合(并且也由多个线程同时遍历)。这是非常重要的答案。 (3认同)