Différence entre Java Énumération et Iterator
-
09-09-2019 - |
Question
Quelle est la différence exacte entre ces deux interfaces? Est-ce que Enumeration
des avantages sur l'utilisation Iterator
? Si quelqu'un pourrait élaborer, un article de référence serait apprécié.
La solution
Regarder l'API Java pour la spécification Iterator
interface, il y a une explication des différences entre Enumeration
:
itérateurs diffèrent de énumérations de deux façons:
- itérateurs permettent à l'appelant de supprimer des éléments du sous-jacent collection lors de l'itération avec sémantique bien définie.
- Les noms de méthode ont été améliorées.
La ligne de fond est, à la fois Enumeration
et Iterator
donneront des éléments successifs, mais Iterator
est amélioré de telle manière pour que les noms des méthodes sont plus courtes, et a un procédé de remove
supplémentaire. Voici une comparaison côte à côte:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Comme mentionné aussi dans l'API Java Spécifications, pour les nouveaux programmes, Iterator
doit être préféré Enumeration
, comme « Itérateur prend la place de Énumération dans le cadre des collections Java. » (A partir des spécifications Iterator
.)
Autres conseils
itérateurs sont fail-rapide . à-dire lorsque l'on change le fil collection en utilisant ajouter / supprimer des opérations, tandis qu'un autre fil parcourt à travers un itérateur en utilisant la méthode de hasNext() or next()
, l'itérateur ne parvient rapidement en lançant ConcurrentModificationException
. Le comportement fail-rapide de itérateurs peut être utilisé que pour détecter les bugs. Les énumérations retournés par les méthodes de classes comme Hashtable, Vector ne sont pas fail-rapide qui est obtenue en synchronisant le bloc de code dans la méthode de nextElement()
qui verrouille l'objet vectoriel du courant qui coûte beaucoup de temps.
« officiellement », ils sont censés être similaire à l'interface itérateur de support des opérations supplémentaires (par exemple, suppression). En général, la tendance est d'utiliser itérateurs.
Voici de l'interface d'énumération javadocs :
NOTE: La fonctionnalité de cette interface est reproduite par la interface iterator. En plus, Iterator ajoute une option supprimer fonctionnement, et a procédé plus court des noms. De nouvelles mises en œuvre devraient envisager d'utiliser de préférence Iterator à Enumeration.
Un fait simple, mais ne l'ont pas mentionné dans les réponses précédentes est que Iterator<T>
est utilisé avec Iterable<T>
pour servir dans l'interprétation structure for(_type_ element:collection){...}
.
Il y a trois différences de base dans Énumération et Iterator
Enumeration
1. il est d'utiliser pour la classe que Lagacy (par exemple. Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. Opération de lecture peut être effectuer, nous ne pouvons pas supprimer l'élément.
3. Deux méthodes sont disponibles
- hasNextElement public boolean ();
- public Object nextElement ();
Iterator
-
il est applicable pour toute la collection
Iterator itr = c.iterator(); where c is any `Collection` class
-
Lire et supprimer l'opération peut être effectuer
-
Trois méthodes sont disponibles
- hasNext public boolean ();
- public Object next ();
- supprimer public void ();
LIMITER CE dans les deux
- Ne déplacer vers l'avant
- Il n'y a pas des méthodes pour
Add object
etReplace object
Si vous écrivez votre propre classe de collection, et vous étendre l'une des classes existantes ou la mise en œuvre l'une des interfaces cadre des collections, vous avez pratiquement pas d'autre choix que d'utiliser Iterator.
Si pour une raison quelconque (que je ne peux pas penser) que vous créez une classe de collection personnalisée qui ne se rapporte pas à java.util.Collection ou java.util.Map de quelque façon, vous devriez encore mettre en œuvre Iterable afin que les gens peuvent utiliser votre classe pour les boucles.
La principale différente est la méthode d'énumération ne pas exposer de suppression (). De plus, Iterator ne permettent pas une navigation en même temps et à la modification d'un objet sous-jacent. Ils ont un contrôle pour voir s'il y a des modifications simultanées ou plus, et prend donc plus de traitement. Ainsi, la performance de Enumeration est pratiquement 50% plus rapide que Iterator. Si nous avons besoin de navigation n'ignorant une telle synchronisation, il suffit d'utiliser Enumeration.
Enumeration peut être utilisé que pour la classe héritage (Vector, Stack ...), tout en Iterator peut être utilisé pour tous.
Les deux iterator et le dénombrement sont utilisés pour récupérer les données, la différence est que l'énumération peut être utilisé que pour les classes héritées i.e. vecteur / pile tandis que les itérateurs peuvent être utilisés pour le reste. Énumération peut également être utilisé pour la clé définie dans les cartes.