Разница между итератором и листитератором?


140
Iterator ite = Set.iterator();
Iterator ite = List.iterator();

ListIterator listite = List.listIterator();

Мы можем использовать, Iteratorчтобы пройти через Seta, a Listили a Map. Но ListIteratorможет использоваться только для прохождения List, а не для прохождения Set. Зачем?

Я знаю, что основное отличие состоит в том, что с итератором мы можем двигаться только в одном направлении, а с ListIteratorпомощью - в обоих направлениях. Есть еще отличия? И какие преимущества ListIteratorперед Iterator?


в дополнение к ответу Петерса я бы порекомендовал вам прочитать главу о размышлениях на Java об итераторах со всеми хорошими примерами там
ant

Ответы:


152

Различия перечислены в документации Javadoc для ListIterator.

Вы можете

  • итерация назад
  • получить итератор в любой точке.
  • добавить новое значение в любой момент.
  • установить новое значение в этой точке.

68
И причина, по которой вы не можете сделать это с помощью a Set, проста: нет «текущей точки»: у элементов нет индекса, и нет удобного способа добавить элемент «до» или «после» другого.
Joachim Sauer

@Peter Lawrey получить индекс в любой момент - это о методах previousIndex () и nextIndex () ?
gstackoverflow

2
@gstackoverflow check java.util.List # listIterator (int)
kilonet

4
@kilonet вместо того, чтобы получать индекс в любой момент , следует ли его формулировать как «получить итератор в любой момент», чтобы избежать путаницы?
Шайлеш Пратапвар,

40

Есть два отличия:

  1. Мы можем использовать Iterator для обхода Set и List, а также объектов типа Map. В то время как ListIterator может использоваться для обхода объектов типа списка, но не для объектов типа набора.

    То есть мы можем получить объект Iterator с помощью Set и List, см. Здесь:

    Используя Iterator, мы можем извлекать элементы из объекта коллекции только в прямом направлении.

    Методы в итераторе:

    1. hasNext()
    2. next()
    3. remove()
    Iterator iterator = Set.iterator();
    Iterator iterator = List.iterator();
  2. Но мы получаем объект ListIterator только из интерфейса List, см. Здесь:

    где ListIterator позволяет перемещаться в любом направлении (как вперед, так и назад). Так что есть два метода , как hasPrevious()и previous()другие , чем у итератора. Также мы можем получить индексы следующего или предыдущего элемента (используя nextIndex() и previousIndex()соответственно)

    Методы в ListIterator:

    1. hasNext ()
    2. следующий()
    3. предыдущий ()
    4. hasPrevious ()
    5. удалять()
    6. nextIndex ()
    7. previousIndex ()
    ListIterator listiterator = List.listIterator();

    т.е. мы не можем получить объект ListIterator из интерфейса Set.

Ссылка: - В чем разница между Iterator и ListIterator?


39
Похоже, это в значительной степени скопировано с сайта kirankumarjava.blogspot.com/2013/06/… . Вы всегда должны указывать на первоначального автора.
Кэмерон Скиннер

25

Итератор - это суперкласс ListIterator.

Вот различия между ними:

  1. С помощью iteratorвы можете двигаться только вперед, но с помощью ListIteratorвы можете перемещаться назад во время чтения элементов.
  2. С помощью ListIteratorвы можете получить индекс в любой момент во время обхода, что невозможно с iterators.
  3. С помощью iteratorвы можете проверить только следующий доступный элемент или нет, но listiteratorвы можете проверить предыдущий и следующий элементы.
  4. С listiteratorего помощью вы можете добавить новый элемент в любой момент во время перемещения. Невозможно с iterator.
  5. С помощью listiteratorвы можете изменять элемент при перемещении, что невозможно с iterator.

Внешний вид итератора:

 public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove(); //optional-->use only once with next(), 
                         dont use it when u use for:each
    }

ListIterator внешний вид:

public interface ListIterator<E> extends Iterator<E> {
    boolean hasNext();
    E next();
    boolean hasPrevious();
    E previous();
    int nextIndex();
    int previousIndex();
    void remove(); //optional
    void set(E e); //optional
    void add(E e); //optional
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.