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

Était-ce utile?

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

  1. il est applicable pour toute la collection

    Iterator itr = c.iterator();  
    where c is any `Collection` class
    
  2. Lire et supprimer l'opération peut être effectuer

  3. 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 et Replace 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top