В чем разница между итератором и итерабельностью и как их использовать?

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

См. Javadoc.

Ответ 3

Итерируемый: Класс, который можно повторить. То есть тот, у которого есть понятие "принесите мне первое, теперь следующее, и так далее, пока мы не закончим".

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

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

public interface Collection<E> extends Iterable<E> {}

Например, возьмите любую коллекцию. Коллекция представляет собой интерфейс, представляющий контейнер для ряда элементов. Все коллекции, такие как ArrayList, Vector реализуют Collection и так Iterator.

Одно из преимуществ Iterable заключается в том, что при реализации Iterable этот объект получает поддержку для: каждого синтаксиса цикла.

Ответ 4

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

Ответ 5

Реализация интерфейса 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.

Ответ 6

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

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

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

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

  1. Я собираюсь показать исходный код ArrayList с помощью метода iterator() следующим образом для получения более подробной информации.

Метод iterator() возвращает объект класса Itr, который реализует Iterator.

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. Некоторые другие методы или классы будут повторять элементы коллекций, такие как 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);
    }
}

Теперь понятно? :)

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

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

С другой стороны, Итерируемый - это другой интерфейс, который, если он реализуется классом, заставляет класс быть итерабельным и является целью для конструкции 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

Ответ 10

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

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

Ответ 11

Вопрос: Разница между Iterable и Iterator?
Ans:

iterable: он связан с forEach loop Итератор: Is относится к коллекции

Целевой элемент цикла forEach shouble может быть итерабельным.
Мы можем использовать Iterator для получения объекта по одному из коллекции

Итераторы присутствуют в пакете java.ḷang
Итератор присутствует в пакете java.util

Содержит только один метод iterator()
Содержит три метода hasNext(), next(), remove()

Представлен в версии 1.5
Представлено в версии 1.2

Ответ 12

В дополнение к ColinD и Seeker ответы.

Простыми словами, Итерируемый и Итератор - оба интерфейса, предоставляемые в Java Collection Framework.

Iterable

Класс должен реализовать интерфейс Iterable, если он хочет, чтобы каждый цикл повторялся по его коллекции. Однако цикл for-each может использоваться только для циклического перемещения коллекции в прямом направлении, и вы не сможете изменять элементы в этой коллекции. Но, если все, что вы хотите, это прочитать данные элементов, то это очень просто и благодаря выражению лямбды Java это часто один лайнер. Например:

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

Итератор

Этот интерфейс позволяет вам перебирать коллекцию, получать и удалять ее элементы. Каждый из классов коллекции предоставляет метод iterator(), который возвращает итератор в начало коллекции. Преимущество этого интерфейса над iterable заключается в том, что с помощью этого интерфейса вы можете добавлять, изменять или удалять элементы в коллекции. Но для доступа к элементам требуется немного больше кода, чем итеративный. Например:

for (Iterator i = c.iterator(); i.hasNext(); ) {
       Element e = i.next();    //Get the element
       System.out.println(e);    //access or modify the element
}

Источники:

Ответ 13

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

public interface Collection<E> extends Iterable<E>  

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