아니요 정확히 동일하지 않습니다. 그리고 그것은 쉽게 검증 할 수 있습니다.
그냥 다음과 같은 두 가지 기능을 디 컴파일 : 우리가 뭔가가 변수 및 만드는 끝낼 볼 수 있도록
public static void test1(java.lang.Object[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: aload_0
4: arraylength
5: if_icmpge 23
8: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_0
12: iload_1
13: aaload
14: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V
17: iinc 1, 1
20: goto 2
23: return
public void test2(java.lang.Object[]);
Code:
0: aload_1
1: astore_2
2: aload_2
3: arraylength
4: istore_3
5: iconst_0
6: istore 4
8: iload 4
10: iload_3
11: if_icmpge 34
14: aload_2
15: iload 4
17: aaload
18: astore 5
20: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream;
23: aload 5
25: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V
28: iinc 4, 1
31: goto 8
34: return
}
난 그냥 println 메소드를 (포함) :
public static void test1(Object[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public void test2(Object[] arr) {
for(Object o : arr) {
System.out.println(o);
}
}
과 출력에서 볼 javac은 그것을 최적화하지 않는다. 분명히 큰 그림에서 차이점은 중요하지 않으며 측정 할 수는 없지만 여전히 동일한 코드는 아닙니다.)
제 2의 기능에서 정확히 무슨 일이 일어나는지 확실하지 않지만 누군가 원하는 경우 시간을 갖고 코드를 해부하십시오 ;-)
출처
2011-03-20 18:07:11
Voo
대단히 고마워요. 그래서 두 번째 문장에서는 iterator에 대해 하나의 메모리 할당 만있을 것입니다. 또는 각 반복에 대한 다른 할당? 그리고 세 번째로 ... 자바는 숨겨진 반복자를 할당합니까? 그리고 배열 길이에 대한 숨겨진 정수? – Oneiros
맞습니다. 모험이라면 javap을 사용하여 각 종류의 루프에 대해 생성 된 바이트 코드를 볼 수 있습니다. 그들은 거의 동일해야합니다. –
오, 나는 javap에 대해 몰랐다 ... 다시 한번 감사드립니다! :) – Oneiros