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



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

1701   12  

12 ответов:

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

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

как правило, an Iterable должен быть в состоянии произвести любое количество действующих Iterators.

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

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

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

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

посмотреть документация.

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

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

чтобы сделать объект итерационным, он должен излучать

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

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

class SomeClass implements Iterable<String> {}

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

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

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

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

Я отвечу на вопрос, особенно о 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 реализует список, список реализует Коллекция и коллекция реализует Iterable.. То есть, вы могли бы увидеть отношения, как

    'Iterable

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

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

'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, используя итератор (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);
    }
}

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

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

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

с другой стороны, Iterable - это другой интерфейс, который, если он реализован классом, заставляет класс быть итерационным и является целью для каждой конструкции. Он имеет только один метод с именем 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 яблоками. Когда он реализует Iterable, это похоже на то, чтобы поместить каждое яблоко в коробки от 1 до 10 и вернуть итератор, который можно использовать для навигации.

путем снабжать итератор, мы можем получить любое яблоко, Яблоко в следующих коробках ЕТК.

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

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

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

вопрос: разница между Iterable и Iterator?
Ответ:

iterable: это связано с циклом forEach
итератор: это имеет отношение к коллекции

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

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

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

введено в версии 1.5
Введено в версии 1.2

кроме ColinD и Искатель ответы.

проще говоря, Iterable и итератор оба интерфейса предоставляются в рамках коллекции Java.

Iterable

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

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
}

источники:

  1. Java Doc Iterable
  2. Java Doc Итератор

Comments

    Ничего не найдено.