:
public class ArrayIterator
{
public static void main(String[] argv)
{
String[] strs = new String[] { "1", "2", "3", "4", "5" };
enhancedPrint(strs);
normalPrint(strs);
}
public static void enhancedPrint(String[] strs)
{
for (String s : strs)
{
System.out.println(s);
}
}
public static void normalPrint(String[] strs)
{
String[] localArray = strs;
int len = localArray.length;
for (int i = 0; i < len; i++)
{
String s = localArray[i];
System.out.println(s);
}
}
}
これは、反復機能のために解体(javap -c ArrayIterator
)バイトコードです:
強化プリント:
public static void enhancedPrint(java.lang.String[]);
Code:
0: aload_0
1: astore_1
2: aload_1
3: arraylength
4: istore_2
5: iconst_0
6: istore_3
7: iload_3
8: iload_2
9: if_icmpge 31
12: aload_1
13: iload_3
14: aaload
15: astore 4
17: getstatic #10; //Field java/lang/System.out:Ljava/io/PrintStream;
20: aload 4
22: invokevirtual #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
25: iinc 3, 1
28: goto 7
31: return
ループの通常:あなたが見ることができるように
public static void normalPrint(java.lang.String[]);
Code:
0: aload_0
1: astore_1
2: aload_1
3: arraylength
4: istore_2
5: iconst_0
6: istore_3
7: iload_3
8: iload_2
9: if_icmpge 31
12: aload_1
13: iload_3
14: aaload
15: astore 4
17: getstatic #10; //Field java/lang/System.out:Ljava/io/PrintStream;
20: aload 4
22: invokevirtual #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
25: iinc 3, 1
28: goto 7
31: return
、両方の場合において、コンパイラは、配列の長さ(strs.length
)をロードされ、それに対してループ。配列の場合、for-eachループの拡張は、(Iteratorを使用するObjectの場合ではなく)配列の長さに対してループするための構文的砂糖であることがわかります。私はそれがはるかに少ない慣用的であるように、それは拡張forループと同じバイトコードを持っていることをループのための「通常」を編集した
。すべての目的と目的で、通常のforループバージョンは、各ループに対して拡張されたものをコンパイルするときにコンパイラが生成するものです。
[各ループのJavaはどのように動作しますか?](http://stackoverflow.com/questions/85190/how-does-the-java-for-each-loop-work) –
+1興味深い質問ではなく、全く重複していません。 –
私はすでに反復可能であることを知っていますが、イテレータは反復をいつ止めるべきかを知っていますか? – SapphireSun