Diferença entre Iterator e Listiterator?


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

ListIterator listite = List.listIterator();

Podemos usar Iteratorpara percorrer a Setou a Listou a Map. Mas ListIteratorsó pode ser usado para atravessar a List, não pode atravessar a Set. Por quê?

Eu sei que a principal diferença é que, com o iterador, podemos viajar em apenas uma direção, mas também com as ListIteratorduas. Há outras diferenças lá? E alguma vantagem de ListIteratormais Iterator?


Além de resposta Peters eu recomendo que você leia um capítulo no pensamento em java sobre iterators com todos os exemplos agradáveis lá
formiga

Respostas:


150

As diferenças estão listadas no Javadoc for ListIterator

Você pode

  • iterar para trás
  • obtenha o iterador a qualquer momento.
  • adicione um novo valor a qualquer momento.
  • defina um novo valor nesse ponto.

68
E a razão pela qual você não pode fazer isso com a Seté simples: não há "ponto atual": os elementos não têm índice e não há maneira útil de adicionar um elemento "antes" ou "depois" de outro.
Joachim Sauer

@ Peter Lawrey obtém o índice a qualquer momento - trata-se dos métodos previousIndex () e nextIndex () ?
Gtackoverflow 17/07/2018

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

4
@ kilonet, em vez de obter o índice a qualquer momento , deve ser redigido como "obter o iterador a qualquer momento" para evitar confusão?
Shailesh Pratapwar

39

Existem duas diferenças:

  1. Podemos usar o Iterator para percorrer Set e List e também mapear os tipos de objetos. Enquanto um ListIterator pode ser usado para percorrer objetos do tipo lista, mas não para objetos do tipo conjunto.

    Ou seja, podemos obter um objeto Iterator usando Set e List, veja aqui:

    Usando o Iterator, podemos recuperar os elementos do Objeto de Coleção somente na direção direta.

    Métodos no iterador:

    1. hasNext()
    2. next()
    3. remove()
    Iterator iterator = Set.iterator();
    Iterator iterator = List.iterator();
  2. Mas nós obtemos o objeto ListIterator apenas na interface List, veja aqui:

    onde como um ListIterator permite percorrer as duas direções (para frente e para trás). Por isso, tem mais dois métodos como hasPrevious()e previous()excepto os da Iterator. Além disso, podemos obter índices dos elementos seguintes ou anteriores (usando nextIndex() e previousIndex()respectivamente)

    Métodos no ListIterator:

    1. hasNext ()
    2. Próximo()
    3. anterior()
    4. hasPrevious ()
    5. remover()
    6. nextIndex ()
    7. previousIndex ()
    ListIterator listiterator = List.listIterator();

    ou seja, não podemos obter o objeto ListIterator da interface Set.

Referência: - Qual a diferença entre Iterator e ListIterator?


39
Parece que é amplamente recortado em kirankumarjava.blogspot.com/2013/06/… . Você deve sempre reconhecer o autor original.
Cameron Skinner

25

Iterator é uma super classe de ListIterator.

Aqui estão as diferenças entre eles:

  1. Com iteratorvocê, você pode avançar apenas, mas com ListIteratorvocê pode voltar também ao ler os elementos.
  2. Com ListIteratorvocê pode obter o índice a qualquer momento durante a navegação, o que não é possível com iterators.
  3. Com iteratorvocê pode verificar apenas o próximo elemento disponível ou não, mas listiteratorpode verificar os elementos anteriores e seguintes.
  4. Com listiteratorvocê pode adicionar novo elemento a qualquer momento, enquanto estiver percorrendo. Não é possível com iterator.
  5. Com listiteratorvocê, você pode modificar um elemento ao atravessar, o que não é possível com iterator.

Aparência e sensação do iterador:

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

Aparência do 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
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.