Quelle est la différence exacte entre ces deux interfaces? Est-ce que Enumeration
présente des avantages par rapport à l'utilisation de Iterator
? Si quelqu'un pouvait élaborer, un article de référence serait apprécié.
En regardant la spécification API Java pour l'interface Iterator
, il existe une explication des différences entre Enumeration
:
Les itérateurs diffèrent de énumérations de deux manières:
- Les 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éthodes ont été améliorés.
En fin de compte, Enumeration
et Iterator
donneront des éléments successifs, mais Iterator
sera amélioré de manière à ce que les noms de méthode soient plus courts et comportent une méthode remove
supplémentaire. Voici une comparaison côte à côte:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Comme indiqué également dans les Spécifications de l'API Java, pour les programmes plus récents, Iterator
devrait être préféré à Enumeration
, car "Iterator prend la place de l'énumération dans le cadre des collections Java." (À partir de Iterator
spécifications.)
Les itérateurs sont échec rapide . C'est-à-dire lorsqu'un thread modifie la collection par des opérations d'ajout/suppression, tandis qu'un autre thread la traverse via un itérateur à l'aide de la méthode hasNext() or next()
, l'itérateur échoue rapidement en renvoyant ConcurrentModificationException
. Le comportement d'échec rapide des itérateurs ne peut être utilisé que pour détecter des bogues. Les énumérations renvoyées par les méthodes de classes telles que Hashtable, Vector ne sont pas des pannes rapides qui sont obtenues en synchronisant le bloc de code à l'intérieur de la méthode nextElement()
qui verrouille l'objet Vector en cours, ce qui coûte très longtemps.
"Officiellement", ils sont supposés être similaires avec l'interface d'itérateur prenant en charge des opérations supplémentaires (par exemple, la suppression). Généralement, la tendance est d'utiliser des itérateurs.
Voici de l'interface d'énumération javadocs :
REMARQUE: la fonctionnalité de cette interface est dupliquée par le fichier Interface d'itérateur. En outre, Iterator ajoute une option optionnelle remove opération, et a plus courte méthode des noms. Les nouvelles implémentations devraient Pensez à utiliser de préférence Iterator au dénombrement.
Un fait simple mais qui n’a pas été mentionné dans les réponses précédentes est que Iterator<T>
est utilisé avec Iterable<T>
pour servir dans l’interprétation de la structure for(_type_ element:collection){...}
.
Il existe trois différences fondamentales entre énumération et itérateur.
Dénombrement
1. il est utilisé uniquement pour la classe 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
Itérateur
il est applicable pour toute la collection
Iterator itr = c.iterator();
where c is any `Collection` class
Les opérations de lecture et de suppression peuvent être effectuées
Trois méthodes sont disponibles
Limition dans les deux
Add object
et Replace object
Si vous écrivez votre propre classe de collection et que vous étendez l'une des classes existantes ou implémentez l'une des interfaces du cadre Collections, vous n'avez fondamentalement pas d'autre choix que d'utiliser Iterator.
Si, pour une raison quelconque (à laquelle je ne peux pas penser), vous créez une classe de collection personnalisée qui n'a aucun lien avec Java.util.Collection ou Java.util.Map, vous devez continuez implémenter Iterable afin que les gens puissent utiliser votre classe dans les boucles.
La principale différence est que la méthode Enumeration n’expose pas la méthode remove (). De plus, Iterator n'autorise pas la navigation et la modification simultanées sur un objet sous-jacent. Ils ont un contrôle pour voir s'il y a des modifications concurrentes ou autre, et prennent donc plus de traitement. Ainsi, les performances d’Enumeration sont pratiquement 50% plus rapides que celles d’Iterator. Si nous n'avons besoin que d'une navigation ignorant une telle synchronisation, utilisez simplement Enumeration.
L'énumération ne peut être utilisée que pour la classe héritée (Vector, Stack ...), alors qu'Iterator peut être utilisé pour tous.