4 回答

TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
jvm中有個(gè)String pool,一般在池中有的對(duì)象就不會(huì)再去生成一個(gè)新的。
String s1 = "abc";
生成了一個(gè)字符串對(duì)象"abc"并放入pool中,定義了一個(gè)String變量s1并指向"abc"。
String s = "abc" + s1 + "def";
等式右邊有三個(gè)String 對(duì)象 "abc" 、s1 、"def"
這里("abc"==s1)是true,就是說(shuō)是引用的同一個(gè)內(nèi)存地址。
"abc"已經(jīng)在池中了,直接從池中取出來(lái),這句又創(chuàng)建了一個(gè)"def"的String對(duì)象并放入池中。
當(dāng)前二個(gè)String對(duì)象做連接的時(shí)候,又會(huì)創(chuàng)建一個(gè)新的String對(duì)象"abcabc",并放入池中;然后再做字符串相加"abcabc"+def又生成一個(gè)字串對(duì)象,最后變量s指向這個(gè)新的String對(duì)象。
所以用+來(lái)連接字串會(huì)產(chǎn)生很多臨時(shí)的字串對(duì)象,效率低。一般使用StringBuffer或StringBuilder來(lái)做字串連接。
可以使用new String()來(lái)生成一個(gè)新的String對(duì)象并單獨(dú)分配內(nèi)存空間。
------------------------------------------------------
查了下資料,已經(jīng)改了回答內(nèi)容。
String s = "abc";
這句是定義一個(gè)String變量s,jvm會(huì)先去字符串池中找有沒(méi)有"abc",有的話就把s指向"abc",沒(méi)有就會(huì)先在池中創(chuàng)建一個(gè),再讓s指向"abc"。
String s = new String("abc");
這句是先定義一個(gè)String變量s,然后在內(nèi)存中分配新的空間"abc"再讓s指向這個(gè)內(nèi)存地址。

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊
字符串"abc"只會(huì)創(chuàng)建一次。
而String,每次都會(huì)創(chuàng)建一次。
所以二次出現(xiàn)"abc",實(shí)際上是同一個(gè)對(duì)象。
后來(lái)又出現(xiàn)"def"是另一個(gè)對(duì)象。
s1是一個(gè)對(duì)象,s2也是一個(gè)對(duì)象。
誰(shuí)能解釋一下String s = "abc"; 與String s = new String("abc");之間內(nèi)存的分配情況,當(dāng)然前者創(chuàng)建一個(gè)對(duì)象,后者是創(chuàng)建兩個(gè)對(duì)象。
這種說(shuō)法本來(lái)就是錯(cuò)誤的。如果"abc"在之前沒(méi)有被定義過(guò),那么這兩種方式都將產(chǎn)生兩個(gè)對(duì)象。如果"abc"在之前被定義過(guò),那么兩種都只產(chǎn)生一個(gè)對(duì)象。

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
3個(gè)對(duì)象。"abc" "def" "abcabcdef"
new String("abc");實(shí)際上是先在String pool里面申明一個(gè)abc的String,然后new String()就是說(shuō)強(qiáng)行申請(qǐng)一個(gè)內(nèi)存空間,就像是普通的類(lèi)型的實(shí)例一樣,而不是指向String pool 的內(nèi)存地址。
而String s = "abc";是申請(qǐng)一個(gè)對(duì)象,是在String 的pool里面。s也指向的是這個(gè)內(nèi)存地址。
添加回答
舉報(bào)