Różnica między Iteratorem a Listiteratorem?

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

ListIterator listite = List.listIterator();

Możemy użyć Iteratordo przejścia a Setlub a Listlub a Map. Ale ListIteratormoże być używany tylko do przechodzenia przezList , nie może przechodzić przez Set. Czemu?

Wiem, że główna różnica polega na tym, że z iteratorem możemy podróżować tylko w jednym kierunku, ale w ListIteratorobu kierunkach. Czy są jakieś inne różnice? Jakie są zalety ListIteratorponad Iterator?

Siva
źródło
oprócz odpowiedzi Petersa polecam przeczytanie rozdziału o myśleniu w javie o iteratorach ze wszystkimi fajnymi przykładami
ant

Odpowiedzi:

150

Różnice są wymienione w Javadoc dla ListIterator

Możesz

  • iteruj wstecz
  • uzyskać iterator w dowolnym momencie.
  • dodaj nową wartość w dowolnym momencie.
  • ustawić nową wartość w tym momencie.
Peter Lawrey
źródło
68
A powód, dla którego nie możesz tego zrobić z a Setjest prosty: nie ma „aktualnego punktu”: elementy nie mają indeksu i nie ma żadnego użytecznego sposobu, aby dodać element „przed” lub „po” innym.
Joachim Sauer
@Peter Lawrey uzyskuje indeks w dowolnym momencie - czy chodzi o metody previousIndex () i nextIndex () ?
gstackoverflow
2
@gstackoverflow check java.util.List # listIterator (int)
kilonet
4
@kilonet zamiast pobierać indeks w dowolnym momencie , czy powinien być sformułowany w stylu „uzyskaj iterator w dowolnym momencie”, aby uniknąć nieporozumień?
Shailesh Pratapwar
39

Istnieją dwie różnice:

  1. Możemy użyć Iteratora do przechodzenia przez Set and List, a także typ obiektów Map. Podczas gdy ListIterator może być używany do przechodzenia dla obiektów typu List, ale nie dla obiektów typu Set.

    Oznacza to, że możemy uzyskać obiekt Iterator za pomocą Set and List, patrz tutaj:

    Używając Iteratora, możemy pobrać elementy z obiektu kolekcji tylko w kierunku do przodu.

    Metody w Iteratorze:

    1. hasNext()
    2. next()
    3. remove()
    Iterator iterator = Set.iterator();
    Iterator iterator = List.iterator();
  2. Ale otrzymujemy obiekt ListIterator tylko z interfejsu List, patrz tutaj:

    gdzie jako ListIterator umożliwia przechodzenie w obu kierunkach (zarówno do przodu, jak i do tyłu). Więc ma dwie więcej metod, takich jak hasPrevious()i previous()inne niż te z Iteratora. Możemy również uzyskać indeksy kolejnych lub poprzednich elementów (używając odpowiednio nextIndex() i previousIndex())

    Metody w ListIterator:

    1. hasNext ()
    2. Kolejny()
    3. poprzedni()
    4. hasPrevious ()
    5. usunąć()
    6. nextIndex ()
    7. previousIndex ()
    ListIterator listiterator = List.listIterator();

    tj. nie możemy pobrać obiektu ListIterator z interfejsu Set.

Odniesienie: - Jaka jest różnica między Iteratorem a ListIteratorem?

jaideep
źródło
39
Wygląda na to, że jest w dużej mierze wycięty i wklejony z kirankumarjava.blogspot.com/2013/06/… . Zawsze musisz potwierdzić oryginalnego autora.
Cameron Skinner
25

Iterator jest super klasą ListIterator.

Oto różnice między nimi:

  1. Dzięki iteratormożesz iść tylko do przodu, ale zListIterator możesz przesuwać hasło również podczas czytania elementów.
  2. Dzięki ListIteratormożesz uzyskać indeks w dowolnym momencie podczas przemieszczania, co nie jest możliwe w przypadkuiterator s.
  3. Za pomocą iteratormożesz sprawdzić tylko następny dostępny element lub nie, ale wlistiterator możesz sprawdzić poprzednie i następne elementy.
  4. Za pomocą listiteratormożesz w dowolnym momencie dodać nowy element podczas przemierzania. Nie jest to możliwe ziterator .
  5. Za pomocą listiteratormożna modyfikować element podczas przechodzenia, co nie jest możliwe w przypadku iterator.

Wygląd i styl iteratora:

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

Wygląd i styl 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
}
user1923551
źródło