Я новичок в 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 в качестве примера, чтобы помочь вам лучше понять..
- Итерируемый интерфейс заставляет его подклассы реализовывать абстрактный метод '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'
, И Iterable, Collection и List просто объявляют абстрактный метод iterator(), и только ArrayList реализует его.
- Я собираюсь показать исходный код 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]; } ... } }
- Некоторые другие методы или классы будут повторять элементы коллекций, такие как 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
. Он поддерживает состояние, в котором мы находимся в текущей итерации, и знает, что такое следующий элемент и как его получить.