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