String的存儲原理

String存放在堆中還是棧中

先定義S

String str1 = "abc";

System.out.println(str1 == "abc");

步驟:

1) 棧中開辟一塊空間存放引用str1浇借,

2) String池中開辟一塊空間作喘,存放String常量"abc",

3) 引用str1指向池中String常量"abc",

4) str1所指代的地址即常量"abc"所在地址哥攘,輸出為true

2. String str2 = new String("abc");

? System.out.println(str2 == "abc");

步驟:

1) 棧中開辟一塊空間存放引用str2,

2) 堆中開辟一塊空間存放一個(gè)新建的String對象"abc"猪勇,

3) 引用str2指向堆中的新建的String對象"abc"溜族,

4) str2所指代的對象地址為堆中地址,而常量"abc"地址在池中挤悉,輸出為false

3. String str3 = new String("abc");

? System.out.println(str3 == str2);

步驟:

1) 棧中開辟一塊空間存放引用str3渐裸,

2) 堆中開辟一塊新空間存放另外一個(gè)(不同于str2所指)新建的String對象,

3) 引用str3指向另外新建的那個(gè)String對象

4) str3和str2指向堆中不同的String對象装悲,地址也不相同昏鹃,輸出為false

4. String str4 = "a" + "b";

? System.out.println(str4 == "ab");

步驟:

1) 棧中開辟一塊空間存放引用str4,

2) 根據(jù)編譯器合并已知量的優(yōu)化功能诀诊,池中開辟一塊空間洞渤,存放合并后的String常量"ab",

3) 引用str4指向池中常量"ab"属瓣,

4) str4所指即池中常量"ab"载迄,輸出為true

注:編譯器合并已知量的優(yōu)化功能解釋---

原理1:當(dāng)使用任何方式來創(chuàng)建一個(gè)字符串對象s=X時(shí),Java運(yùn)行時(shí)(運(yùn)行中JVM)會拿著這個(gè)X在String池中找是否存在內(nèi)容相同的字符串對象抡蛙,如果不存在护昧,則在池中創(chuàng)建一個(gè)字符串s,否則粗截,不在池中添加惋耙。

原理2:Java中,只要使用new關(guān)鍵字來創(chuàng)建對象,則一定會(在堆區(qū)或棧區(qū))創(chuàng)建一個(gè)新的對象绽榛。

原理3:使用直接指定或者使用純字符串串聯(lián)來創(chuàng)建String對象遥金,則僅僅會檢查維護(hù)String池中的字符串,池中沒有就在池中創(chuàng)建一個(gè)蒜田,有則罷了稿械!但絕不會在堆棧區(qū)再去創(chuàng)建該String對象。

原理4:使用包含變量的表達(dá)式來創(chuàng)建String對象冲粤,則不僅會檢查維護(hù)String池美莫,而且還會在堆棧區(qū)創(chuàng)建一個(gè)String對象。

5. final String s = "a";

? String str5 = s + "b";

? System.out.println(str5 == "ab");

步驟:

同4? 注:s用了final進(jìn)行了修飾 所以不適用于原理4? 當(dāng)不用final? 適用于原理4 輸出為false

6. String s1 = "a";

? String s2 = "b";

? String str6 = s1 + s2;

? System.out.println(str6 == "ab");

步驟:

1) 棧中開辟一塊中間存放引用s1梯捕,s1指向池中String常量"a"厢呵,

2) 棧中開辟一塊中間存放引用s2,s2指向池中String常量"b"傀顾,

3) 棧中開辟一塊中間存放引用str6襟铭,

4) s1 + s2通過StringBuilder的最后一步toString()方法還原一個(gè)新的String對象"ab",因此堆中開辟一塊空間存放此對象短曾,

5) 引用str6指向堆中(s1 + s2)所還原的新String對象寒砖,

6) str6指向的對象在堆中,而常量"ab"在池中嫉拐,輸出為false

7. String str7 = "abc".substring(0, 2);


步驟:

1) 棧中開辟一塊空間存放引用str7哩都,

2) substring()方法還原一個(gè)新的String對象"ab"(不同于str6所指),堆中開辟一塊空間存放此對象婉徘,

3) 引用str7指向堆中的新String對象漠嵌,

8. String str8 = "abc".toUpperCase();


步驟:

1) 棧中開辟一塊空間存放引用str6,

2) toUpperCase()方法還原一個(gè)新的String對象"ABC"盖呼,池中并未開辟新的空間存放String常量"ABC"儒鹿,

3) 引用str8指向堆中的新String對象

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市几晤,隨后出現(xiàn)的幾起案子约炎,更是在濱河造成了極大的恐慌,老刑警劉巖锌仅,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件章钾,死亡現(xiàn)場離奇詭異,居然都是意外死亡热芹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門惨撇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伊脓,“玉大人,你說我怎么就攤上這事”ㄇ唬” “怎么了株搔?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纯蛾。 經(jīng)常有香客問我纤房,道長,這世上最難降的妖魔是什么翻诉? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任炮姨,我火速辦了婚禮,結(jié)果婚禮上碰煌,老公的妹妹穿的比我還像新娘舒岸。我一直安慰自己,他們只是感情好芦圾,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布蛾派。 她就那樣靜靜地躺著,像睡著了一般个少。 火紅的嫁衣襯著肌膚如雪洪乍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天夜焦,我揣著相機(jī)與錄音典尾,去河邊找鬼。 笑死糊探,一個(gè)胖子當(dāng)著我的面吹牛钾埂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播科平,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼褥紫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瞪慧?” 一聲冷哼從身側(cè)響起髓考,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弃酌,沒想到半個(gè)月后氨菇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妓湘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年查蓉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榜贴。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豌研,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鹃共,我是刑警寧澤鬼佣,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站霜浴,受9級特大地震影響晶衷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阴孟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一晌纫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧温眉,春花似錦缸匪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闯冷,卻和暖如春砂心,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛇耀。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工辩诞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纺涤。 一個(gè)月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓译暂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撩炊。 傳聞我的和親對象是個(gè)殘疾皇子外永,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 從網(wǎng)上復(fù)制的,看別人的比較全面拧咳,自己搬過來伯顶,方便以后查找。原鏈接:https://www.cnblogs.com/...
    lxtyp閱讀 1,348評論 0 9
  • 一:在JAVA中骆膝,有六個(gè)不同的地方可以存儲數(shù)據(jù): 1. 寄存器(register)祭衩。 這是最快的存儲區(qū),因?yàn)樗?..
    辰321閱讀 419評論 0 0
  • 源碼注釋: 翻譯: 返回字符串典型表示形式。 當(dāng)intern方法被掉用時(shí)愉择,如果常量池中已經(jīng)包含字符串劫乱,然后從常量池...
    tianlang136520閱讀 704評論 0 9
  • 138 1.15早讀 I see guys who work at the same company their ...
    123逍遙游閱讀 150評論 0 1
  • 我覺得審美對我來說很重要织中。 比如 看到一個(gè)注冊資金只有5萬元的公司锥涕,他的作品我很欣賞衷戈。想去。 又看到一個(gè)請的到一線...
    輕音94閱讀 219評論 1 0