web-dev-qa-db-fra.com

Différence entre énumération Java et itérateur

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é.

110
cometta

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.)

133
coobird

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.

34
shaILU

"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.

11
Uri

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){...}.

6
Earth Engine

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 

  • public boolean hasNextElement (); 
  • objet public nextElement ();

Itérateur  

  1. il est applicable pour toute la collection 

    Iterator itr = c.iterator();  
    where c is any `Collection` class
    
  2. Les opérations de lecture et de suppression peuvent être effectuées

  3. Trois méthodes sont disponibles

    • public boolean hasNext ();
    • objet public next ();
    • public void remove ();

Limition dans les deux

  • Avancer uniquement dans la direction
  • Il n'y a pas de méthode pour Add object et Replace object 
5
Vipin Jain

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.

2
Licky Lindsay

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.

2
bnguyen82

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. 

0
Jay Sheth