Ответ 1
Если вы перебираете массив, это не имеет значения - в цикле расширенного цикла используется доступ к массиву.
Например, рассмотрим этот код:
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
В расширенном цикле есть еще немного кода настройки, но они в основном делают то же самое. Нет итераторов. Кроме того, я ожидаю, что они получат JITted еще более похожий код.
Предложение: если вы действительно думаете, что это может иметь существенное значение (которое оно будет делать только в том случае, если тело цикла является абсолютно миниатюрным), вы должны сравнить его с вашим реальным приложением. Это единственная ситуация, которая имеет значение.