當你看看這個:
public class a
{
public static void main(String[] args)
{
for (int i = 0; i < 100000; i++)
f(i);
}
public static void f(Integer i)
{
System.out.println(i);
}
}
,看看它是什麼樣子調用javac a.java && javap -c a
後,你會得到
Compiled from "a.java"
public class a {
public a();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: ldc #2 // int 100000
5: if_icmpge 21
8: iload_1
9: invokestatic #3 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
12: invokestatic #4 // Method f:(Ljava/lang/Integer;)V
15: iinc 1, 1
18: goto 2
21: return
public static void f(java.lang.Integer);
Code:
0: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_0
4: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
7: return
}
此字節碼告訴我們Integer.valueOf()
被稱爲(main 9:
),因此沒有優化德在這種情況下,在編譯級別。然而,正如@Tim B指出的那樣,JVM
內發生的事情是另一個無法預測的問題。最好假定最壞的情況 - JVM不會優化它。
嗯,這是我在技術面試中遇到的一個問題,詢問的人相當期待具體的答案。我們在談論HotSpot JVM。我理解你的觀點並同意。 – Sebastian