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

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

12 ответов


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

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

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


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

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

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

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

посмотреть Javadoc.


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

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

сделать итерируемый объект, он должен испускать


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


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


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


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

  1. Iterable interface заставляет свои подклассы реализовывать абстрактный метод '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, Collection и List просто объявляют абстрактный метод ' iterator ()' и ArrayList самостоятельно реализует его.

  1. Я собираюсь показать исходный код ArrayList с помощью метода "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);
    }
}

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


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

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

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

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

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


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

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


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

iterable: это связано с циклом forEach
iterator: Is связан с коллекцией

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

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

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

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


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

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

типа Iterable

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

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 Итератор