Il est préférable d'utiliser de boucle for-each [plus lisible]
for (Flower flower :flowers){
//...
}
J'ai largué les instructions à l'aide de javap
pour le code suivant:
public void forLoop1() {
List<String> lst = new ArrayList<String>();
for (int i = 0; i < lst.size(); i++) {
System.out.println("hi");
}
}
public void forLoop2() {
List<String> lst = new ArrayList<String>();
int size = lst.size();
for (int i = 0; i < size; i++) {
System.out.println("hi");
}
}
public void forLoop1();
Code:
0: new #2; //class java/util/ArrayList
3: dup
4: invokespecial #3; //Method java/util/ArrayList."<init>":()V
7: astore_1
8: iconst_0
9: istore_2
10: iload_2
11: aload_1
12: invokeinterface #4, 1; //InterfaceMethod java/util/List.size:()I
17: if_icmpge 34
20: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
23: ldc #6; //String hi
25: invokevirtual #7; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
28: iinc 2, 1
31: goto 10
34: return
public void forLoop2();
Code:
0: new #2; //class java/util/ArrayList
3: dup
4: invokespecial #3; //Method java/util/ArrayList."<init>":()V
7: astore_1
8: aload_1
9: invokeinterface #4, 1; //InterfaceMethod java/util/List.size:()I
14: istore_2
15: iconst_0
16: istore_3
17: iload_3
18: iload_2
19: if_icmpge 36
22: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
25: ldc #6; //String hi
27: invokevirtual #7; //Method java/io/PrintStream.println:(Ljava/lang/Str
ing;)V
30: iinc 3, 1
33: goto 17
36: return
Il n'est pas optimiser pour moi.
java version "1.6.0_22" Java(TM) SE
Runtime Environment (build
1.6.0_22-b04) Java HotSpot(TM) Client VM (build 17.1-b03, en mode mixte,
le partage)
Donc, si vous devez choisir mentionné deux, va pour la deuxième, mais personnellement, je aller pour for-each
.
pour chaque Performance
À partir de l'Article 46 Efficace Java par Joshua Bloch :
La boucle for-each, introduit dans
la version 1.5, se débarrasser de l'encombrement
et la possibilité de l'erreur par
masquage de l'itérateur ou variable d'index
complètement. L'résultant de l'idiome
s'applique également aux collections et
tableaux:
// The preferred idiom for iterating over collections and arrays
for (Element e : elements) {
doSomething(e);
}
Quand vous voyez le signe deux-points (:), la lire
"en." Ainsi, la boucle ci-dessus se lit comme
"pour chaque élément e dans les éléments." Note
qu'il n'y a pas de perte de performance
pour l'utilisation de la boucle for-each, même pour
les tableaux de. En fait, il peut offrir une légère
avantage de performance sur un ordinaire
pour la boucle dans certaines circonstances, comme il
calcule la limite de l'index de tableau
qu'une seule fois. Alors que vous pouvez le faire par
main (Point 45), les programmeurs ne sont pas
toujours le faire.
Voir Aussi