Qual é a diferença exata entre essas duas interfaces? Tem Enumeration
benefícios sobre o uso Iterator
? Se alguém pudesse elaborar, um artigo de referência seria apreciado.
Qual é a diferença exata entre essas duas interfaces? Tem Enumeration
benefícios sobre o uso Iterator
? Se alguém pudesse elaborar, um artigo de referência seria apreciado.
Respostas:
Observando a especificação da API Java da Iterator
interface, 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 Enumeration
e Iterator
fornecerá elementos sucessivos, mas Iterator
é aprimorada de forma a que os nomes dos métodos sejam mais curtos e possuam um remove
mé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, Iterator
deve ser preferível Enumeration
, pois "O Iterator substitui a Enumeração na estrutura de coleções Java". (Das Iterator
especificações.)
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.
"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.
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 .
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
Iterador
é aplicável a todas as coleções
Iterator itr = c.iterator();
where c is any `Collection` class
A operação de leitura e remoção pode ser realizada
Três métodos estão disponíveis
Limitação em ambos
Add object
eReplace object
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.
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.
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.
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.