Nous utilisons souvent l'interface itérative fournie par JDK pour itérer les collections Java.
Iterator iterator = list.iterator (); while (iterator.hasnext ()) {String string = iterator.next (); // faire quelque chose} L'itération peut en fait être simplement comprise comme une traversée. Il s'agit d'une classe de méthode qui standardise la traversée de tous les objets dans divers conteneurs. C'est un modèle de conception très typique. Le modèle d'itérateur est une méthode d'accès standard utilisée pour traverser les classes de collecte. Il résume l'accès à la logique de différents types de classes de collecte, évitant ainsi d'exposer la structure interne de la collection au client. C'est ainsi que nous y faisons face lorsqu'il n'y a pas d'itérateur. comme suit:
Pour les tableaux, nous utilisons des indices pour traiter:
int [] arrays = new int [10]; for (int i = 0; i <arrays.length; i ++) {int a = arrays [i]; // faire quelque chose} C'est ainsi que ArrayList est géré:
List <string> list = new ArrayList <string> (); for (int i = 0; i <list.size (); i ++) {String String = list.get (i); // faire quelque chose} Pour les deux méthodes, nous savons toujours à l'avance la structure interne de la collection. Le code d'accès et la collection eux-mêmes sont étroitement couplés et ne peuvent pas séparer la logique d'accès de la classe de collection et du code client. Dans le même temps, chaque collection correspond à une méthode de traversée et le code client ne peut pas être réutilisé. Dans les applications pratiques, il est assez difficile d'intégrer les deux ensembles ci-dessus. Ainsi, afin de résoudre les problèmes ci-dessus, le mode itérateur est vacant et il utilise toujours la même logique pour traverser la collection. Cela rend le client lui-même inutile pour maintenir la structure interne de la collection, et tous les états internes sont maintenus par itérateur. Le client ne traite jamais directement de la classe de collecte. Il contrôle toujours l'itérateur et l'envoie "vers l'avant", "arrière" et "prendre l'élément actuel" des commandes, et il peut indirectement traverser toute la collection.
Ce qui précède n'est qu'une brève explication du modèle d'itérateur. Jetons un coup d'œil à l'interface Iterator en Java pour voir comment il l'implémente.
1. Java.util.iterator
Dans Java, Iterator est une interface, qui ne fournit que des règles de base itératives. Dans JDK, il est défini comme celui-ci: un itérateur qui itère sur la collection. L'itérateur remplace l'énumération dans le cadre des collections Java. Il existe deux différences entre les itérateurs et les énumérations:
1. L'itérateur permet à l'appelant de supprimer les éléments de la collection pointé par l'itérateur pendant l'itération en utilisant une sémantique bien définie.
2. Le nom de la méthode a été amélioré.
La définition de l'interface est la suivante:
Interface publique Iterator {boolean Hasnext (); Objet suivant (); void reous ();} dans:
Object Next (): Renvoie la référence à l'élément que l'itérateur ne fait que traverser. La valeur de retour est l'objet, qui doit être jeté au type dont vous avez besoin.
booléen hasnext (): détermine s'il existe des éléments disponibles dans le conteneur pour accéder
void retire (): Retirez l'élément que l'itérateur vient de croiser
Pour nous, nous devons seulement utiliser Next () et Hasnext () pour terminer l'itération. comme suit:
for (iterator it = c.iterator (); it.hasnext ();) {objet o = it.next (); // faire quelque chose} L'explication précédente est que Iterator a un grand avantage, c'est-à-dire que nous n'avons pas besoin de connaître les résultats internes de l'ensemble. La structure interne et l'état de l'ensemble sont maintenus par itérateur. Nous jugeons et obtenons l'élément suivant à travers les méthodes unifiées hasnext () et suivant (). Quant à l'implémentation interne spécifique, nous n'avons pas à nous en soucier. Mais en tant que programmeur qualifié, il est très nécessaire de déterminer la mise en œuvre de l'itérateur. Le code source de ArrayList est analysé ci-dessous.
2. Implémentation de l'itérateur pour chaque collection
Analysons la mise en œuvre de l'Iterator de ArrayList. En fait, si nous comprenons les structures de données de ArrayList, HashSet et TreeSet et les mettant en œuvre en interne, nous serons confiants sur la façon dont ils mettent en œuvre Iterator. Étant donné que l'implémentation interne de ArrayList utilise un tableau, nous devons seulement enregistrer l'indice de la position correspondante et que l'implémentation de sa méthode est relativement simple.
2.1. Ilétateur Implémentation de ArrayList
Inside ArrayList, définit d'abord un ITR de classe interne, qui implémente l'interface d'Itérateur, comme suit:
classe privée ITR implémente Iterator <e> {// faire quelque chose} Et la méthode Iterator () de ArrayList est implémentée:
public iterator <e> iterator () {return new ITR ();} Ainsi, la méthode de ArrayList.iterator () renvoie la classe intérieure ITR (), donc ce dont nous devons nous soucier maintenant, c'est de la mise en œuvre de la classe intérieure ITR ():
Trois variables de type int sont définies à l'intérieur de l'ITR: curseur, lastret et attendmodCount. où le curseur représente la position d'index de l'élément suivant, et Lastret représente la position d'index de l'élément précédent
int curseur; int lastret = -1; int attendModCount = modCount;
D'après les définitions du curseur et de Lastret, on peut voir que Lastret a toujours été un moins que le curseur, donc la méthode de mise en œuvre de Hasnext () est extrêmement simple. Il vous suffit de juger si le curseur et Lastret sont égaux.
public boolean hasnext () {return curseur! = size;} La mise en œuvre de Next () est en fait relativement simple. Renvoyez simplement l'élément en position d'index du curseur, puis modifiez le curseur et le lastret
public e suivant () {checkForComodification (); int i = cursor; // Record Index Position if (i> = size) // Si l'élément d'obtention est supérieur au nombre d'éléments de collecte, une exception est lancée, lancez new NosuchementException (); objet [] elementData = arrayList.tthis.ElementData; if (i> = elementData.Length) lancez de nouveaux modification ConcurrentModification (); cursor = i + 1; // curseur + 1return (e) elementData [lastret = i]; // lastret + 1 et renvoyer l'élément au curseur} CheckForComodification () est principalement utilisé pour déterminer si le nombre de modifications d'un ensemble est légal, c'est-à-dire pour déterminer si l'ensemble a été modifié pendant le processus de traversée. ModCount est utilisé pour enregistrer le nombre de modifications de la collection ArrayList, initialisé à 0, et chaque fois que la collection est modifiée une fois (la mise à jour interne ne compte pas pour la structure), telles que ADD, supprimer et d'autres méthodes, ModCount + 1, donc si ModCount reste inchangé, cela signifie que le contenu de la collection n'a pas été modifié. Ce mécanisme est principalement utilisé pour mettre en œuvre le mécanisme de défaillance rapide de la collection ArrayList. Dans les collections Java, une grande partie des collections a un mécanisme de défaillance rapide. Je n'en parlerai pas ici, et j'en parlerai plus tard. Par conséquent, pour garantir qu'il n'y a pas d'erreurs pendant le processus de traversée, nous devons nous assurer qu'il n'y aura pas de modifications structurelles à la collection pendant le processus de traversée (sauf pour la méthode de suppression). Si une erreur d'exception se produit, nous devons vérifier attentivement si le programme a une erreur au lieu de ne pas le traiter après Catch.
Final void checkForComodification () {if (modCount! = attendModCount) New concurrentModificationException ();} La méthode supprimée () est une implémentation, qui appelle la méthode Suppel () de ArrayList elle-même pour supprimer l'élément de position Lastret, puis modifier le modCount.
public void dissovel () {if (lastret <0) lance un nouvel illégalstateException (); checkForComodification (); try {ArrayList.This.Remove (lastet); cursor = lastret; lastret = -1;Ce qui précède est la méthode d'implémentation de l'itération de l'itérateur de la collection Java qui vous est présentée par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!