2 回答

TA貢獻(xiàn)1827條經(jīng)驗 獲得超8個贊
在你的第一個例子中:
String s = "happ"; s = s.concat("y");
當(dāng)這些語句被執(zhí)行1 時,字符串池中已經(jīng)創(chuàng)建了String
對象來表示(分別)文字和文字。 "happ"
"y"
第二條語句的執(zhí)行創(chuàng)建了一個String
表示字符串的新對象"happy"
。此對象不在字符串池中。
我想特別澄清這個疑問,當(dāng)對來自池和堆的字符串進(jìn)行操作時,字符串將 concat 方法的結(jié)果存儲在何處。
它是在堆2 中創(chuàng)建的,而不是在字符串池中。具體來說。
String
API 中在字符串池中創(chuàng)建對象的唯一方法是String.intern()
. (這包括構(gòu)造函數(shù)。)
1 - 請注意我在這里仔細(xì)選擇的詞。如果是第一次執(zhí)行語句,則字符串池中對象的創(chuàng)建可能是在語句執(zhí)行過程中發(fā)生的?;蛘咚赡芤郧鞍l(fā)生過。確切的時間是特定于實現(xiàn)的。但是,JLS 保證對于相同的文字不會發(fā)生多次。
2 - 請注意,對于現(xiàn)代 HotSpot JVM,字符串池位于常規(guī)堆中。它不是一個單獨的空間。字符串池實際上只是一個(JVM 私有的)數(shù)據(jù)結(jié)構(gòu)。
添加回答
舉報