String?s1?=?"a";??
String?s2?=?"b";?
?
String?s3?=?"ab";
String?s6?=?s1+s2;??
System.out.println("s3==s6?->?"+?(s3==s6));
final?String?s8?=?"a"?;???
final?String?s9?=?"b"?;??
String?s10?=?s8?+?s9;?
System.out.println("s3==s10?->?"+?(s3==s10));?
output:
s3==s6?->?false
s8==s1?->?true
字節(jié)碼:
0:?ldc???????????#16?????????????????//?String?a???
2:?astore_1
3:?ldc???????????#18?????????????????//?String?b???
5:?astore_2
6:?ldc???????????#20?????????????????//?String?ab??
8:?astore_3
//?s6的過程,這個(gè)我知道
17:?new???????????#22?????????????????//?class?java/lang/StringBuilder
20:?dup
21:?aload_1
22:?invokestatic??#24?????????????????//?Method?java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
25:?invokespecial?#30?????????????????//?Method?java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
28:?aload_2
29:?invokevirtual?#33?????????????????//?Method?java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
32:?invokevirtual?#37?????????????????//?Method?java/lang/StringBuilder.toString:()Ljava/lang/String;
35:?astore?
//?下面是問題
//?同樣是相加,為什么s10不走s6的過程??而是直接取#20。
48:?ldc???????????#16?????????????????//?String?a?????//s8
50:?astore????????8
52:?ldc???????????#18?????????????????//?String?b????//s9
54:?astore????????9
56:?ldc???????????#20?????????????????//?String?ab????/s10
58:?astore????????10
1 回答

wldraa
TA貢獻(xiàn)33條經(jīng)驗(yàn) 獲得超17個(gè)贊
可能是 javac 比較智能吧,看到相加的兩個(gè)變量都是 用 final 修飾的,所以認(rèn)為結(jié)果也應(yīng)該是常量,然后就在編譯過程中算好了,正好又發(fā)現(xiàn) “ab”已經(jīng)存在,于是就拿過來用了
添加回答
舉報(bào)
0/150
提交
取消