關于字符串和字符串常量相加

先貼一段代碼

public static void main(String[] args){
String s1 = "abc";
String s2 = "a";
String s3 = "bc";
String s4 = "a" + "bc";
String s5 = "a" + s3;
String s6 = s2 + s3;
System.out.println(s1 == s4); //true
System.out.println(s1 == s5); //false
System.out.println(s1 == s6); //false
}

程序輸出最后是true,false,false芜赌。之前一直不太懂為什么是這個輸出結果,這幾天在學字節(jié)碼述么,于是查看了這段程序的字節(jié)碼而昨。

public class com.neo.test.Test {
public com.neo.test.Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String abc
2: astore_1
3: ldc #3 // String a
5: astore_2
6: ldc #4 // String bc
8: astore_3
9: ldc #2 // String abc
11: astore 4
13: new #5 // class java/lang/StringBuilder
16: dup
17: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
20: ldc #3 // String a
22: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
25: aload_3
26: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
29: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
32: astore 5
34: new #5 // class java/lang/StringBuilder
37: dup
38: invokespecial #6 // Method java/lang/StringBuilder."<init>":()V
41: aload_2
42: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
45: aload_3
46: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
49: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
52: astore 6
54: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream;
57: aload_1
58: aload 4
60: if_acmpne 67
63: iconst_1
64: goto 68
67: iconst_0
68: invokevirtual #10 // Method java/io/PrintStream.println:(Z)V
71: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream;
74: aload_1
75: aload 5
77: if_acmpne 84
80: iconst_1
81: goto 85
84: iconst_0
85: invokevirtual #10 // Method java/io/PrintStream.println:(Z)V
88: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream;
91: aload_1
92: aload 6
94: if_acmpne 101
97: iconst_1
98: goto 102
101: iconst_0
102: invokevirtual #10 // Method java/io/PrintStream.println:(Z)V
105: return
}

從字節(jié)碼中可以看出来氧,字符串"+"其實是調用的StringBuilder的append方法太示,在每次執(zhí)行"+"的時候都會先new一個StringBuilder對象來存儲需要相加的字符串侥锦,最后通過toString()方法來轉換成String挽荠。因此得到的String是一個新的對象克胳。所以s1和s5,s6的地址是不同的。

在代碼中s4 = "a" +"bc"對應的字節(jié)碼是9: ldc #2 // String abc
圈匆,和第一句s1 = "abc"對應的字節(jié)碼是一樣的漠另,在網上查找之后,在字符串常量相加時候跃赚,預編譯時候會把"+"優(yōu)化笆搓,直接把兩個字符串常量自動合成一個字符串常量性湿,因此s1和s4其實是常量池中同一個字符串"abc"的引用,因此返回結果是true满败。

這僅僅是學習記錄肤频。。算墨∠模可能有表達出錯或者我理解出錯的地方,如果有大佬看到了本咸魚的筆記emmmm歡迎指正~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末净嘀,一起剝皮案震驚了整個濱河市报咳,隨后出現的幾起案子,更是在濱河造成了極大的恐慌挖藏,老刑警劉巖暑刃,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異膜眠,居然都是意外死亡岩臣,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門宵膨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來婿脸,“玉大人,你說我怎么就攤上這事柄驻『鳎” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵鸿脓,是天一觀的道長抑钟。 經常有香客問我,道長野哭,這世上最難降的妖魔是什么在塔? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮拨黔,結果婚禮上蛔溃,老公的妹妹穿的比我還像新娘。我一直安慰自己篱蝇,他們只是感情好贺待,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著零截,像睡著了一般麸塞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涧衙,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天哪工,我揣著相機與錄音奥此,去河邊找鬼。 笑死雁比,一個胖子當著我的面吹牛稚虎,可吹牛的內容都是我干的。 我是一名探鬼主播偎捎,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼祥绞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸭限?” 一聲冷哼從身側響起蜕径,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎败京,沒想到半個月后兜喻,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡赡麦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年朴皆,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泛粹。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡遂铡,死狀恐怖,靈堂內的尸體忽然破棺而出晶姊,到底是詐尸還是另有隱情扒接,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布们衙,位于F島的核電站钾怔,受9級特大地震影響,放射性物質發(fā)生泄漏蒙挑。R本人自食惡果不足惜宗侦,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忆蚀。 院中可真熱鬧矾利,春花似錦、人聲如沸馋袜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桃焕。三九已至剑肯,卻和暖如春捧毛,著一層夾襖步出監(jiān)牢的瞬間观堂,已是汗流浹背让网。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留师痕,地道東北人溃睹。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像胰坟,于是被迫代替她去往敵國和親因篇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容