7 回答

TA貢獻(xiàn)1條經(jīng)驗(yàn) 獲得超6個(gè)贊
就創(chuàng)建了一個(gè)?
String s = "a" + "b" + "c" + "d" + "e";?
賦值符號(hào)右邊的"a"、"b"、"c"、"d"、"e"都是常量?
對(duì)于常量,編譯時(shí)就直接存儲(chǔ)它們的字面值而不是它們的引用?
在編譯時(shí)就直接講它們連接的結(jié)果提取出來變成了"abcde"?
該語(yǔ)句在class文件中就相當(dāng)于String s = "abcde"?
然后當(dāng)JVM執(zhí)行到這一句的時(shí)候, 就在String pool里找?
如果沒有這個(gè)字符串,就會(huì)產(chǎn)生一個(gè)

TA貢獻(xiàn)2條經(jīng)驗(yàn) 獲得超3個(gè)贊
答:對(duì)于如下代碼:
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");
System.out.println(s3 == "ab");
第一條語(yǔ)句打印的結(jié)果為false,第二條語(yǔ)句打印的結(jié)果為true,這說明javac編譯可以對(duì)字符串常量直接相加的表達(dá)式進(jìn)行優(yōu)化,不必要等到運(yùn)行期去進(jìn)行加法運(yùn)算處理,而是在編譯時(shí)去掉其中的加號(hào),直接將其編譯成一個(gè)這些常量相連的結(jié)果。
題目中的第一行代碼被編譯器在編譯時(shí)優(yōu)化后,相當(dāng)于直接定義了一個(gè)”abcd”的字符串,所以,上面的代碼應(yīng)該只創(chuàng)建了一個(gè)String對(duì)象。寫如下兩行代碼,
?????????? String s = "a" + "b" + "c" + "d";
?????????? System.out.println(s == "abcd");
最終打印的結(jié)果應(yīng)該為true。

TA貢獻(xiàn)1條經(jīng)驗(yàn) 獲得超1個(gè)贊
只創(chuàng)建了一個(gè),因?yàn)?String?s="a"+"b"+"c"+"d"; String?s1="abcd"; System.out.println(s==s1); 結(jié)果為true,所以s和s1是一個(gè)對(duì)象,答案也就應(yīng)該是一個(gè)對(duì)象

TA貢獻(xiàn)2條經(jīng)驗(yàn) 獲得超1個(gè)贊
實(shí)際上不一定,最多七個(gè),最少可能一個(gè)都沒有,string維護(hù)了一個(gè)對(duì)象池,只要池里有的,就會(huì)返回已經(jīng)存在的對(duì)象。
添加回答
舉報(bào)