В чем разница между итератором и итерируемым и как их использовать? - PullRequest
167 голосов
/ 28 июля 2011

Я новичок в Java, и я действительно смущен итератором и повторяем.Может кто-нибудь объяснить мне и привести несколько примеров?

Ответы [ 12 ]

171 голосов
/ 28 июля 2011

Iterable - это простое представление серии элементов, которые могут быть повторены. У него нет состояния итерации, такого как «текущий элемент». Вместо этого у него есть один метод, который производит Iterator.

Iterator - это объект с состоянием итерации. Он позволяет проверить, есть ли у него больше элементов, используя hasNext(), и перейти к следующему элементу (если есть), используя next().

Как правило, Iterable должен иметь возможность производить любое количество действительных Iterator с.

81 голосов
/ 28 июля 2011

Реализация Iterable - это та, которая обеспечивает Iterator себя:

public interface Iterable<T>
{
    Iterator<T> iterator();
}

Итератор - это простой способ позволить некоторым циклически проходить через коллекцию данных без прав назначения (хотя и с возможностью удаления).

public interface Iterator<E>
{
    boolean hasNext();
    E next();
    void remove();
}

См. Javadoc .

11 голосов
/ 28 июля 2011

Если коллекция является итеративной, то она может быть повторена с использованием итератора (и, следовательно, может использоваться для каждого цикла.) Итератор - это реальный объект, который будет выполнять итерацию по коллекции.

9 голосов
/ 07 июля 2014

Реализация интерфейса Iterable позволяет объекту быть целью оператора foreach.

class SomeClass implements Iterable<String> {}

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

    for(String s : someClass) {
     //do something
    }
  }
}

Итератор - это интерфейс, который имеет реализацию для итерации по элементам. Iterable - это интерфейс, который предоставляет Iterator.

6 голосов
/ 08 декабря 2017

Я отвечу на вопрос, особенно о ArrayList, в качестве примера, чтобы помочь вам лучше понять.

  1. Итерируемый интерфейс заставляет свои подклассы реализовывать абстрактный метод 'iterator ()'.
public interface Iterable {
  ...
  abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
  ...
}
Интерфейс итератора заставляет его подклассы реализовывать абстрактный метод 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.
  ...
}
ArrayList реализует List, List реализует Collection и Collection реализует Iterable .. То есть вы могли видеть взаимосвязь, такую ​​как

'Iterable <- Collection <- List <- ArrayList' </p>

.И Iterable, Collection и List просто объявляют абстрактный метод iterator (), и только ArrayList реализует его.

Я собираюсь показать исходный код 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];
          }
          ...
  }
}
Некоторые другие методы или классы будут перебирать элементы коллекций, например ArrayList, используя Iterator (Itr).

Вот простой пример.

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 голосов
/ 27 августа 2014

Самое важное соображение заключается в том, должен ли рассматриваемый элемент быть в состоянии пройти более одного раза.Это потому, что вы всегда можете перемотать Iterable с помощью повторного вызова iterator (), но нет способа перемотать Iterator.

2 голосов
/ 17 августа 2017

Рассмотрим пример с 10 яблоками.Когда он реализует Iterable, это все равно, что помещать каждое яблоко в блоки от 1 до 10 и возвращать итератор, который можно использовать для навигации.

Реализуя итератор, мы можем получить любое яблоко, яблоко в следующих полях и т. Д.

Таким образом, реализация iterable дает итератору возможность перемещаться по его элементам, хотя для навигации необходимо реализовать итератор.

1 голос
/ 14 ноября 2017

Как объяснено здесь , « Итерируемый » был введен для использования в цикле foreach.Класс, реализующий интерфейс Iterable , может быть повторен.

Итератор - это класс, который управляет итерацией по Итерируемый .Он поддерживает состояние, в котором мы находимся в текущей итерации, и знает, что такое следующий элемент и как его получить.

1 голос
/ 07 июня 2017

В сущности, оба они очень тесно связаны друг с другом.

Рассмотрим Итератор как интерфейс, который помогает нам проходить через коллекцию с помощью некоторых неопределенных методов.как hasNext (), next () и remove ()

С другой стороны, 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

0 голосов
/ 06 февраля 2019

Iterable были введены для использования в каждом цикле в java

public interface Collection<E> extends Iterable<E>  

Iterator - это класс, который управляет итерацией по Iterable.Он поддерживает состояние, в котором мы находимся в текущей итерации, и знает, что такое следующий элемент и как его получить.

...