本帖最后由 刘敏 于 2013-11-29 09:13 编辑
做了一个实验:
String a = "test";String b = "test" +"bbb";
String c = a + "bbb";
生成b:
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String test
2: astore_1
3: ldc #3; //String testbbb
5: astore_2
6: return
生成c:
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String test
2: astore_1
3: new #3; //class java/lang/StringBuilder
6: dup
7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
10: aload_1
11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: ldc #6; //String bbb
16: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_2
23: return
上面是实验结果,可以看见,如果是两个字符串相加,例如b, Java在编译时就确定好了 b的理论地址,在常量区;
如果是对象加字符串,则需要在运行时new对象,c 的地址就在堆区;所以c 和b地址肯定不相同。
|