Diferença entre enumeração Java e iterador

120

Qual é a diferença exata entre essas duas interfaces? Tem Enumerationbenefícios sobre o uso Iterator? Se alguém pudesse elaborar, um artigo de referência seria apreciado.

cometta
fonte
3
Eu usei uma pesquisa no google eo primeiro resultado foi uma discussão interessante em JavaRanch sobre enumeração vs Iterator
victor hugo

Respostas:

142

Observando a especificação da API Java da Iteratorinterface, há uma explicação das diferenças entre Enumeration:

Os iteradores diferem das enumerações de duas maneiras:

  • Os iteradores permitem que o chamador remova elementos da coleção subjacente durante a iteração com semântica bem definida.
  • Os nomes dos métodos foram aprimorados.

A linha inferior é, ambos Enumeratione Iteratorfornecerá elementos sucessivos, mas Iteratoré aprimorada de forma a que os nomes dos métodos sejam mais curtos e possuam um removemétodo adicional . Aqui está uma comparação lado a lado:

  Enumeration                     Iterator
  ----------------                ----------------
  hasMoreElement()                hasNext()
  nextElement()                   next()
  N/A                             remove()

Como também mencionado nas Especificações da API Java, para programas mais recentes, Iteratordeve ser preferível Enumeration, pois "O Iterator substitui a Enumeração na estrutura de coleções Java". (Das Iteratorespecificações.)

coobird
fonte
9
Acho que falta um pouco de explicação nessa resposta em relação à simultaneidade.
Maarten Bodewes
@Paul_Draper: as edições não devem adicionar um novo significado à postagem, é para isso que servem os comentários.
Emil
2
@coobird Você tem certeza de que "as enumerações são normalmente mais rápidas"? desde que a enumeração tem "bloco de código de sincronização dentro do nextElement ()" e não temos sincronização nos iteradores, o que causa ConcurrentModificationException rit ?? Vamos chamar Iteradores são geralmente mais rápidos e as enumerações são um pouco mais seguras. ??
Kanagavelu Sugumar
@KanagaveluSugumar Obrigado por apontar isso. (Não notei que a discussão adicional foi adicionada a essa resposta.) Rolei a edição, pois ela não era totalmente precisa.
coobird
Acho que vale ressaltar que remove () é um método opcional na interface do Iterator e muitas classes de implementação não o implementam.
Kutzi
35

Os iteradores são à prova de falhas . ou seja, quando um thread altera a coleção por operações de adição / remoção, enquanto outro thread o percorre através de um Iterator usando o hasNext() or next()método, o iterador falha rapidamente ao lançar ConcurrentModificationException. O comportamento de falha rápida dos iteradores pode ser usado apenas para detectar erros. As enumerações retornadas pelos métodos de classes como Hashtable, Vector não são à prova de falhas, o que é conseguido através da sincronização do bloco de código dentro do nextElement()método que bloqueia o objeto Vector atual, que custa muito tempo.

shaILU
fonte
5
Apenas parcialmente verdadeiro: esse comportamento não está definido na interface, depende da implementação do Iterator. É verdade que as implementações de coleções 'antigas' em java.util (HashSet, ArrayList etc.) exibem esse comportamento. No entanto, as coleções 'simultâneas' mais recentes nunca lançam uma ConcurrentModificationException, elas percorrerão a coleção a partir do momento da criação do iterador. Outras implementações podem mostrar um comportamento ainda diferente.
Kutzi
1
Também vale ressaltar: "Observe que o comportamento à prova de falhas não pode ser garantido, pois, de um modo geral, é impossível dar garantias concretas na presença de modificação simultânea não sincronizada. As operações com falha rápida lançam o ConcurrentModificationException com o melhor esforço. Portanto, , seria errado escrever um programa que dependesse dessa exceção para sua correção: ConcurrentModificationException deve ser usado apenas para detectar erros. " docs.oracle.com/javase/7/docs/api/java/util/…
Kutzi
11

"Oficialmente", eles devem ser semelhantes à interface do iterador que suporta operações extras (por exemplo, remoção). Geralmente, a tendência é usar iteradores.

Aqui é de interface de enumeração javadocs :

NOTA: A funcionalidade desta interface é duplicada pela interface Iterator. Além disso, o Iterator adiciona uma operação de remoção opcional e possui nomes de métodos mais curtos. Novas implementações devem considerar o uso do Iterator em vez da Enumeração.

Uri
fonte
6

Um fato simples, mas não mencionado nas respostas anteriores, Iterator<T>é usado Iterable<T>para servir na for(_type_ element:collection){...}estrutura de interpretação .

Earth Engine
fonte
5

Há três diferenças básicas em Enumeração e Iterador

Enumeração
1. é usado apenas para a classe de atraso (por exemplo Vector) .

    Enumeration e = v.elements();  
    v is the object of `Vector` class

2. A operação de leitura pode ser executada, não podemos remover o elemento.
3. Dois métodos estão disponíveis

  • booleano público hasNextElement ();
  • objeto público nextElement ();

Iterador

  1. é aplicável a todas as coleções

    Iterator itr = c.iterator();  
    where c is any `Collection` class
  2. A operação de leitura e remoção pode ser realizada

  3. Três métodos estão disponíveis

    • booleano público hasNext ();
    • Public object next ();
    • remoção de vazio público ();

Limitação em ambos

  • Mover apenas a direção para frente
  • Não há métodos para Add objecteReplace object
Vipin Jain
fonte
2

Se você está escrevendo sua própria classe de coleção e está estendendo alguma das classes existentes ou implementando qualquer uma das interfaces da estrutura Collections, basicamente não tem outra opção a não ser usar o Iterator.

Se, por algum motivo (no qual não consigo pensar), você estiver criando uma classe de coleção personalizada que não se relaciona com java.util.Collection ou java.util.Map de qualquer forma, você ainda deve implementar o Iterable para que as pessoas possam usar sua classe para loops.

Licky Lindsay
fonte
2

A principal diferença é que a enumeração não expõe o método remove (). Além disso, o Iterator não permite uma navegação e modificação simultânea em um objeto subjacente. Eles têm um controle para ver se há modificações simultâneas ou mais e, portanto, precisam de mais processamento. Portanto, o desempenho da Enumeração é praticamente 50% mais rápido que o Iterator. Se precisarmos apenas de navegação para ignorar essa sincronização, basta usar Enumeração.

bnguyen82
fonte
É verdade que a Enumeração "não" expõe o método remove () - mas também não presta atenção à invocação da API remove () da Collection. Por exemplo, o código a seguir será impresso: AAA, CCC, EEE. -------------------------------------------------- --- Vetor <> v = novo Vetor <> (6); v.add ("AAA"); v.add ("BBB"); v.add ("CCC"); v.add ("DDD"); v.add ("EEE"); v.add ("FFF"); Enumeração <> en = v.elements (); while (en.hasMoreElements ()) Valor da string = (String) en.nextElement (); System.out.println (valor); v.remove (valor);
Javauser71
1

1) A principal diferença entre Iterador e Enumeração é a remoção do elemento ao percorrer a coleção. O Iterator pode remover o elemento durante a travessia da coleção, pois possui o método remove (). A enumeração não possui o método remove ().

2) A enumeração é à prova de falhas por natureza. Não lança ConcurrentModificationException se Collection for modificado durante o percurso. O iterador é de falha rápida por natureza. Ele lança ConcurrentModificationException se uma coleção for modificada enquanto itera diferente de seu próprio método remove ().

3) A enumeração é uma interface herdada usada para atravessar Vector, Hashtable. O iterador não é uma interface herdada. O iterador pode ser usado para a travessia de HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet.

Dhirendra Gautam
fonte
0

A enumeração pode ser usada apenas para a classe herdada (Vector, Stack ...), enquanto o Iterator pode ser usado para todos.

Jay Sheth
fonte
-1

O iterador e a enumeração são usados ​​para recuperar os dados, a diferença é que a enumeração pode ser usada apenas para classes herdadas, como vetor / pilha, enquanto os iteradores podem ser usados ​​para o restante. A enumeração também pode ser usada para o conjunto de chaves nos mapas.

Pavan Kumar
fonte
Onde você viu que pode usar a Enumeração para conjuntos de chaves do Mapa ??
Kutzi