如果您正在循环一个数组,那应该没关系 - 增强的 for 循环无论如何都会使用数组访问。
例如,考虑以下代码:
public static void main(String[] args)
{
for (String x : args)
{
System.out.println(x);
}
}
当使用javap -c Test 反编译时,我们得到(对于main 方法):
public static void main(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 #2; //Field java/lang/System.out:Ljava/io/PrintStream;
20: aload 4
22: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
25: iinc 3, 1
28: goto 7
31: return
现在将其更改为使用显式数组访问:
public static void main(String[] args)
{
for (int i = 0; i < args.length; i++)
{
System.out.println(args[i]);
}
}
这反编译为:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: aload_0
4: arraylength
5: if_icmpge 23
8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_0
12: iload_1
13: aaload
14: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: iinc 1, 1
20: goto 2
23: return
在增强的 for 循环中有更多设置代码,但它们基本上在做同样的事情。不涉及迭代器。此外,我希望他们能够 JITted 到更相似的代码。
建议:如果您真的认为它可能会产生显着差异(只有在循环体绝对微不足道的情况下,它才会永远这样做),那么您应该用您的实际应用程序对其进行基准测试。这是唯一重要的情况。