專題整理之—String的字符串常量池

為了加深對Java語言的理解披泪,加深對Java各種特性的理解與掌握,平常會自己歸納一些專題的分析和總結(jié)菊匿「杜唬基于自己的理解计福,感覺哪些部分適合在一起進(jìn)行總結(jié)跌捆,就歸納為一個專題了∠笥保可能一個專題里面的東西也不屬于一個類別佩厚,或者也比較雜亂,請見諒说订。
本文是在總結(jié)不可變對象與String的不可變中抄瓦,涉及到的String的字符串常量池潮瓶。感覺這個部分比較重要,面試也經(jīng)掣奇ⅲ考到這些毯辅,就單獨(dú)拿出來作為一個專題。(此篇總結(jié)大部分是借鑒了CSDN的一篇文章煞额,然后加上了一些自己的理解)

字符串常量池:

  • 為了減少在jvm中創(chuàng)建的字符串的數(shù)量思恐,字符串類維護(hù)了一個字符串常量池,字符串常量池(String pool)是Java堆內(nèi)存中一個特殊的存儲區(qū)域膊毁;
  • 當(dāng)創(chuàng)建String對象時胀莹,jvm會先檢查字符串常量池,如果這個字符串的常量值已經(jīng)存在在池中了婚温,就直接返回池中對象的引用描焰,如果不在池中,就會實(shí)例化一個字符串并放入池中栅螟;
  • 常量池:用于保存java在編譯期就已經(jīng)確定的荆秦,已經(jīng)編譯的class文件中的一份數(shù)據(jù)。包括了類力图、方法萄凤、接口中的常量,也包括字符串常量搪哪,如String s = "a"這種聲明方式靡努;
String s1 = "aaa";
String s2 = "aaa";
1PAI~[D5DA))%XZ~5S6])RH.png

從日常的面試題展開:

String s = new String("abc"); //創(chuàng)建了幾個對象

兩個;
第一個對象是"abc"字符串存儲在常量池中晓折;
第二個對象是創(chuàng)建在Heap中的String對象惑朦;這里的s是放在棧里面的指向了Heap堆中的String對象。

String s1 = new String("s1") ;
String s2 = new String("s1") ; //創(chuàng)建了幾個對象

三個漓概;
第一個是編譯期就已經(jīng)創(chuàng)建在常量池中創(chuàng)建的"s1"漾月,因?yàn)閯?chuàng)建一個之后常量池中就會有,不再創(chuàng)建胃珍,直接指向梁肿;
后面兩個是運(yùn)行期使用new創(chuàng)建在堆上的s1和s2;

示例1:

String s0 = "111";              //pool
String s1 = new String("111");  //heap
final String s2 = "111";        //pool
String s3 = "sss111";           //pool
String s4 = "sss" + "111";      //pool
String s5 = "sss" + s0;         //heap 
String s6 = "sss" + s1;         //heap
String s7 = "sss" + s2;         //pool
String s8 = "sss" + s0;         //heap
 
System.out.println(s3 == s4);   //true
System.out.println(s3 == s5);   //false
System.out.println(s3 == s6);   //false
System.out.println(s3 == s7);   //true
System.out.println(s5 == s6);   //false
System.out.println(s5 == s8);   //false

示例2:

String str1 = "abc";
String str2 = "abc";
String str3 = "abc";
String str4 = new String("abc");
String str5 = new String("abc");
String str6 = new String("abc");
@DPKA4RS@H{0GJJ7SH)FPP8.png

結(jié)論:

  1. 單獨(dú)使用""引號創(chuàng)建的字符串都是常量觅彰,編譯器就已經(jīng)存儲到常量池中了吩蔑;
  2. 使用new String()創(chuàng)建的是對象會存儲到heap中,是運(yùn)行期創(chuàng)建的填抬;
  3. 使用只包含常量的字符串連接符如"a"+"a"創(chuàng)建的也是常量烛芬,編譯器就能確定,并存儲到常量池"aa",但不會有"a"存在赘娄;
  4. 使用包含變量的字符串連接符如"a"+s1創(chuàng)建的對象會存儲在堆中仆潮,運(yùn)行時期才創(chuàng)建;只要s1是變量遣臼,不論s1指向池常量池中的字符串對象還是堆中的字符串對象性置,運(yùn)行期"a"+s1操作實(shí)際上是編譯器創(chuàng)建了StringBuilder對象進(jìn)行了append操作后通過toString()返回了一個字符串對象存在heap上。
  5. 對于final String s2 = "111"揍堰,是一個用final修飾的變量蚌讼,在編譯期就已知了,在包含變量的字符串連接符"a"+s2時直接用常量"111"來代替s2个榕,等效于"a"+"111"篡石,在編譯期就已經(jīng)生產(chǎn)了字符串對象"a111"對象在常量池中。

目前全部文章列表:
idea整合restful風(fēng)格的ssm框架(一)
idea整合restful風(fēng)格的ssm框架(二)
idea整合spring boot+spring mvc+mybatis框架
idea整合springboot+redis
JVM學(xué)習(xí)之—Java內(nèi)存區(qū)域
JVM學(xué)習(xí)之—垃圾回收與內(nèi)存分配策略
專題整理之—不可變對象與String的不可變
專題整理之—String的字符串常量池

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末西采,一起剝皮案震驚了整個濱河市凰萨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌械馆,老刑警劉巖胖眷,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異霹崎,居然都是意外死亡珊搀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門尾菇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來境析,“玉大人,你說我怎么就攤上這事派诬±拖” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵默赂,是天一觀的道長沛鸵。 經(jīng)常有香客問我,道長缆八,這世上最難降的妖魔是什么鞋既? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任锥余,我火速辦了婚禮镐依,結(jié)果婚禮上骇陈,老公的妹妹穿的比我還像新娘灾炭。我一直安慰自己坡氯,他們只是感情好泉瞻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布莽囤。 她就那樣靜靜地躺著咙鞍,像睡著了一般房官。 火紅的嫁衣襯著肌膚如雪趾徽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天翰守,我揣著相機(jī)與錄音孵奶,去河邊找鬼。 笑死蜡峰,一個胖子當(dāng)著我的面吹牛了袁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播湿颅,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼载绿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了油航?” 一聲冷哼從身側(cè)響起崭庸,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谊囚,沒想到半個月后怕享,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡镰踏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年函筋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奠伪。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡跌帐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绊率,到底是詐尸還是另有隱情含末,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布即舌,位于F島的核電站佣盒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏顽聂。R本人自食惡果不足惜肥惭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望紊搪。 院中可真熱鬧蜜葱,春花似錦、人聲如沸耀石。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至揭鳞,卻和暖如春炕贵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背野崇。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工称开, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乓梨。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓鳖轰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親扶镀。 傳聞我的和親對象是個殘疾皇子蕴侣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

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

  • 從網(wǎng)上復(fù)制的,看別人的比較全面臭觉,自己搬過來昆雀,方便以后查找。原鏈接:https://www.cnblogs.com/...
    lxtyp閱讀 1,344評論 0 9
  • ??需要說明的一點(diǎn)是胧谈,這篇文章是以《深入理解Java虛擬機(jī)》第二版這本書為基礎(chǔ)的忆肾,這里假設(shè)大家已經(jīng)了解了JVM的運(yùn)...
    Geeks_Liu閱讀 13,993評論 5 44
  • 前言 RTFSC (Read the fucking source code )才是生活中最重要的。我們天天就是要...
    二毛_coder閱讀 447評論 1 1
  • 前面有幾篇文章分析了我對合格CTO的定義菱肖,以及普通技術(shù)人員如何快速成長為合格CTO客冈,有不少朋友跟我反饋,非常同意我...
    杜仲閑談閱讀 810評論 0 3
  • 今天開家長會稳强,因?yàn)槲疑习喑≈伲龐寢屌R時出差,沒有去退疫,炎瑋有點(diǎn)小失落渠缕。炎瑋說今天的節(jié)目她喜歡前面四個武術(shù)節(jié)目,還有后面...
    李炎瑋爸爸閱讀 177評論 0 0