更新时间:2023-09-18 09:34:04
要查看Java编译器生成的内容,使用 javap -c
显示生成的实际字节码总是很有用的:
To see what the Java compiler produces it is always useful to use javap -c
to show the actual bytecode produced:
例如以下Java代码:
For example the following Java code:
String s1 = "Four" + 4;
int i = 4;
String s2 = "Four" + i;
将产生以下字节码:
0: ldc #2; //String Four4
2: astore_1
3: iconst_4
4: istore_2
5: new #3; //class java/lang/StringBuilder
8: dup
9: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
12: ldc #5; //String Four
14: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/
String;)Ljava/lang/StringBuilder;
17: iload_2
18: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lan
g/StringBuilder;
21: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/la
ng/String;
24: astore_3
25: return
由此我们可以看到:
"Four" + 4
的情况下,Java编译器(我使用的是JDK 6)足够聪明,可以推断出这是一个常量,因此在运行时无需进行任何计算工作,因为字符串是在编译时连接的"Four" + i
,等效代码为 new StringBuilder().append("Four").append(i).toString()
"Four" + 4
, the Java compiler (I was using JDK 6) was clever enough to deduce that this is a constant, so there is no computational effort at runtime, as the string is concatenated at compile time"Four" + i
, the equivalent code is new StringBuilder().append("Four").append(i).toString()