Java foreach efficacité
J'ai quelque chose comme ceci:
Map<String, String> myMap = ...;
for(String key : myMap.keySet()) {
System.out.println(key);
System.out.println(myMap.get(key));
}
Est donc myMap.keySet()
appelé une fois dans le boucle foreach?
Je pense que c'est, mais que vous voulez de votre avis.
Je voudrais savoir si en utilisant foreach de cette façon (myMap.keySet()
) a un impact sur les performances ou c'est équivalent à ceci:
Set<String> keySet = myMap.keySet();
for (String key : keySet) {
...
}
- (La syntaxe de renforcement de la boucle for est un peu de l'arrière vers l'avant.)
- Je ne sais pas si je serais d'accord avec l'appel de cette optimisation prématurée. Il est raisonnable de vouloir comprendre ce que le compilateur est en train de faire avec votre code. Nous avons également aucune idée à quel point, dans son projet (s'il est à même de travailler sur un projet et ne pas poser sur le plan scolaire), il est demander ce. Il pourrait être à la fin.
- +1 pour la question.
Vous devez vous connecter pour publier un commentaire.
Si vous voulez être absolument certain, puis le compiler à la fois des moyens et le décompiler et de les comparer. Je l'ai fait avec de la source suivante:
et quand j'ai décompilé le fichier de classe avec Jad, j'obtiens:
Et voilà votre réponse. Elle est appelée une fois avec, soit pour l'-forme de boucle.
next
méthode ont déjà été appelés sur l'itérateur, et donc, tout est génial. Travailler avec des itérateurs toujours senti un peu étrange pour moi, car dans la plupart des cas, l'itération' arrive explicitement au début de la boucle, et je suis en passe (sur le plan conceptuel, au moins) à la fin de la boucle précédente.C'est seulement appelé une seule fois. En fait, il utilise un itérateur de faire le tour.
Par ailleurs, dans votre cas, je pense que vous devriez utiliser
afin d'éviter de chercher dans la carte à chaque fois.
keySet()
est appelée qu'une seule fois. Le "enhanced pour la boucle" est basée sur laIterable
interface, qui l'utilise pour obtenir unIterator
, qui est ensuite utilisé pour la boucle. Il n'est même pas possible d'itérer sur unSet
de toute autre manière, car il n'y a pas d'index ou quoi que ce soit qui pourraient obtenir des éléments individuels.Cependant, ce que vous avez vraiment à faire est de renoncer à ce genre de micro-optimisation de soucis entièrement - si jamais vous avez de réels problèmes de performance, la chance est sur à 99% que c'est quelque chose que vous n'auriez jamais pensé sur votre propre.
La réponse est dans le Langage Java Spécification, pas besoin de décompiler 🙂 c'est Ce que nous pouvons lire sur le renforcement de la déclaration d':
Dans votre cas,
myMap.keySet()
retourne un sous-type deIterable
donc vosfor
énoncé est équivalent à celui-ci de basefor
déclaration:Et
myMap.keySet()
est donc appelée qu'une seule fois.Oui, il est appelé qu'une seule fois de toute façon
Je crois que c'est le compilateur optimisé pour exécuter qu'une seule fois par boucle d'entrée.