Різниця між Ітератором і Листератором?


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

ListIterator listite = List.listIterator();

Ми можемо використовувати Iteratorдля обходу Seta Listабо a Map. Але ListIteratorйого можна використовувати лише для переходу через a List, а не через a Set. Чому?

Я знаю, що головна відмінність полягає в тому, що за допомогою ітератора ми можемо подорожувати лише в одному напрямку, але ListIteratorми можемо подорожувати в обох напрямках. Чи є інші відмінності? І якісь переваги ListIteratorнад Iterator?


окрім відповіді Петерса, я б рекомендував вам прочитати розділ про роздуми в Java про ітераторів з усіма приємними прикладами там
мураха

Відповіді:


150

Відмінності перераховані в Javadoc для ListIterator

Ти можеш

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

68
І причина, чому ви не можете це зробити з a Set, проста: Немає "поточної точки": Елементи не мають індексу, і немає корисного способу додавання елемента "до" або "після" ще одного.
Йоахім Зауер

@Peter Lawrey отримує індекс у будь-якій точці - це про методи попереднійIndex () та nextIndex () ?
gstackoverflow

2
@gstackoverflow check java.util.List # listIterator (int)
кілонет

4
@kilonet замість отримання індексу в будь-якій точці , чи слід його формулювати як "отримати ітератор у будь-якій точці", щоб уникнути плутанини?
Шайлеш Пратапвар

39

Є дві відмінності:

  1. Ми можемо використовувати Ітератор для переходу набір і списку, а також тип об’єктів на карті. У той час як ListIterator можна використовувати для переміщення по об'єктах типу списку, але не для об'єктів типу Set.

    Тобто ми можемо отримати об’єкт Ітератора, використовуючи Set and List, дивіться тут:

    Використовуючи Iterator, ми можемо отримувати елементи з об'єкта Collection лише у напрямку вперед.

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

    1. hasNext()
    2. next()
    3. remove()
    Iterator iterator = Set.iterator();
    Iterator iterator = List.iterator();
  2. Але ми отримуємо об’єкт ListIterator лише з інтерфейсу List, дивіться тут:

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

    Методи в ListIterator:

    1. hasNext ()
    2. наступний ()
    3. Попередній()
    4. hasPrevious ()
    5. видалити ()
    6. nextIndex ()
    7. попереднійIndex ()
    ListIterator listiterator = List.listIterator();

    тобто ми не можемо отримати об'єкт ListIterator з інтерфейсу Set.

Довідка: - Чим відрізняється Iterator від ListIterator?


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

25

Iterator - це суперклас ListIterator.

Ось відмінності між ними:

  1. З iteratorвами можна рухатись лише вперед, але разом з ListIteratorвами можна рухати і заднім словом, читаючи елементи.
  2. З ListIteratorви можете отримати індекс в будь-який момент під час проходження, яке неможливо з iteratorс.
  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.