作者:xuguoqing07舱污。菜鳥一個(gè),希望能把所學(xué)到的內(nèi)容記錄下來粱栖,同時(shí)能幫助到他人话浇。文中若有錯(cuò)誤以及各位若有新的想法,還請(qǐng)指點(diǎn)一二闹究,在下感激不盡幔崖。
String 類:
(1)String str="abc";
如果方法區(qū)中的常量池里存在 abc,則 str 里面放的是此 abc 的地址渣淤,str直接指向方法區(qū)中的常量池赏寇;如果方法區(qū)中的常量池里沒有 abc,那么會(huì)在常量池中新建一個(gè) abc价认,然后再把這個(gè) abc 的地址給 str嗅定。總之用踩,str 直接指向方法區(qū)中的常量池渠退。
(2)String str1=new String("abc");
str1 (里面存的是 new 出來的對(duì)象的地址)指向堆內(nèi)存中的對(duì)象。
在這里需要說明一下脐彩,String 底層是 char 類型的數(shù)組碎乃,同時(shí) String 是不可變的字符序列。根據(jù)下面的內(nèi)存圖(畫藝不精......)來解釋一下(1)惠奸、(2)兩個(gè)語句荠锭。
由上圖可以看出 String str="abc" 中的 str1 直接指向方法區(qū)中的常量池里的 abc ,而 圖中 String str3=new String("abc") 中的 str3 里存放的新 new 出來的對(duì)象的地址晨川,即 str3 直接指向新建出來的對(duì)象(為了方便证九,暫且叫做對(duì)象 1)删豺。但是 abc 卻不存放在對(duì)象 1 里,對(duì)象 1 里實(shí)際上存在一個(gè)數(shù)組(暫且叫做 value[ ] 數(shù)組)愧怜,該數(shù)組里存放的是常量池中 abc 的地址呀页。String str4=new String("abc") 與 str3 一樣,所以 System.out.println(str3==str4); 的結(jié)果為 false拥坛,而 System.out.println(str3.equals(str4)); 的運(yùn)行結(jié)果為 true蓬蝶。
(3)String str5=new String(cArr);
char [ ] cArr={'a','b','c'};
String str5=new String(cArr);
注意(2)與(3)的區(qū)別!2峦铩丸氛! (3) 里面?zhèn)鬟M(jìn)去的是一個(gè)數(shù)組,不是直接給一個(gè)字符串著摔,根據(jù)圖 2 解釋如下:
根據(jù)上圖缓窜,在棧內(nèi)存里為 main 方法開辟一塊空間,里面有變量 cArr 和 str5谍咆。在堆 (heap) 里開辟了一個(gè) char(字符) 數(shù)組禾锤,把該數(shù)組的地址值賦給cArr,即 cArr 指向該數(shù)組摹察,str5 存放的是新 new 出來的對(duì)象的地址恩掷,即 str5 指向該對(duì)象,然后供嚎,重點(diǎn)來了黄娘,把數(shù)組的地址(cArr 的值)放到新建對(duì)象的 value[ ] 數(shù)組里(上文提到過)。然后新建對(duì)象會(huì)在堆內(nèi)存里新開辟一個(gè)空間克滴,根據(jù)地址值寸宏,找到 char [ ],把 char [ ] 數(shù)組里的內(nèi)容 copy 到新開辟的空間里偿曙,然后新建對(duì)象就指向新開辟的空間。
(4)StringBuffer
StringBuffer a=new StringBuffer("A");//第一句
a.append("B");//第二句
內(nèi)存圖如下所示:
語法第一句和文章 (2) String str1=new String("abc") 一樣羔巢,在這里就不廢話了望忆。在這里補(bǔ)充一句,String 在底層存的是一個(gè)char [ ] 類型的數(shù)組竿秆。所以启摄,"A" 實(shí)際存放在常量池中的 char [ ] 數(shù)組里。然后幽钢,第二句會(huì)把 "B" 放進(jìn) "A" 所在的數(shù)組里歉备,就變成了 "AB"。假設(shè) "A" 所在的數(shù)組存不下所要追加的內(nèi)容 (假設(shè)在此處不成立) 匪燕,那么蕾羊,會(huì)在常量池中新開一塊空間喧笔,把 "A" 和所要追加的內(nèi)容放里面。如圖中紅線所示龟再。