国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java堆、棧、常量池、String

2019-11-11 05:53:53
字體:
來源:轉載
供稿:網(wǎng)友
● 棧:存放基本類型的變量數(shù)據(jù)和對象的引用,但對象本身不存放在棧中,而是存放在堆(new出來的對象)或者常量池中(字符串常量對象存放在常量池中。)● 堆:存放所有new出來的對象。● 常量池:存放字符串常量和基本類型常量(public static final)。字符串常量池既不在堆中也不在棧中,是獨立的內(nèi)存空間管理(方法區(qū)中)。對于字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經(jīng)創(chuàng)建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對于equals相等(僅僅是值相等)的字符串,在常量池中永遠只有一份,在堆中有多份。String創(chuàng)建對象的兩種方式(1) String str = "abc";    創(chuàng)建對象的過程:    ① 首先在常量池中查找是否存在內(nèi)容為"abc"字符串對象    ② 如果不存在則在常量池中創(chuàng)建"abc",并讓str引用該對象    ③ 如果存在則直接讓str引用該對象(2) String str = new String("abc");    創(chuàng)建實例的過程:    ① 首先在堆中(不是常量池)創(chuàng)建一個指定的對象"abc",并讓str引用指向該對象    ② 在字符串常量池中查看,是否存在內(nèi)容為"abc"字符串對象    ③ 若存在,則將new出來的字符串對象與字符串常量池中的對象聯(lián)系起來    ④ 若不存在,則在字符串常量池中創(chuàng)建一個內(nèi)容為"abc"的字符串對象,并將堆中的對象與之聯(lián)系起來    intern() 方法可以返回該字符串在常量池中的對象的引用代碼測試:public class StringTest {    public static void main(String[] args) {        String s1 = "abc";        String s2 = "ab";        String s3 = "c";        String s4 = "ab" + "c";        String s5 = s2 + s3;        String s6 = new String("abc");        String s7 = s6.intern();        System.out.PRintln(s1 == s4); // ①        System.out.println(s1 == s5); // ②        System.out.println(s1 == s6); // ③        System.out.println(s1 == s7); // ④        System.out.println(s6 == s7); // ⑤    }}結果分析:① true    因為String s4 = "ab" + "c";會先查找常量池中是否存在內(nèi)容為"abc"的字符串對象,若存在則直接讓s4引用該對象,顯然String s1 = "abc";會在常量池中創(chuàng)建"abc"對象,所以s1引用該對象,s4也引用該對象,所以S1 == S4為true。② false    因為String s5 = s2 + s3;涉及到變量的相加,會產(chǎn)生新的對象,其內(nèi)部實現(xiàn)是先new一個StringBuilder,然后append(s2),append(s3),然后讓s5引用toString()返回的對象。(若想了解更多細節(jié),可以查看反編譯的代碼)。③ false    String s1 = "abc";------在常量池中建立一個"abc",s1指向"abc";引用s1存儲的是"abc"在常量池的地址。    String s6 = new String("abc");------在堆上分配內(nèi)存,引用s6存儲的是new String("abc") 在堆上的內(nèi)存地址。    還有一點區(qū)別是s1在類加載時就完成了初始化,而s6 要在執(zhí)行引擎執(zhí)行到那一行代碼時才完成初始化。④ true    String s7 = s6.intern();中intern 方法返回s6在常量池中的對象的引用,在字符串常量池中查看,是否存在與字符串s6的內(nèi)容"abc"相等的字符串對象,此處已經(jīng)存在String s1 = "abc";已經(jīng)存在內(nèi)容為"abc"的字符串對象。⑤ false    此處String s7 = s6.intern();等同于String s7 = "abc";    與③同理。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 习水县| 龙川县| 上林县| 林甸县| 曲靖市| 平乡县| 威信县| 张掖市| 汝城县| 神木县| 特克斯县| 晋中市| 长子县| 印江| 太白县| 资源县| 徐水县| 德庆县| 霍州市| 临澧县| 阿图什市| 寻乌县| 屏山县| 平陆县| 津市市| 东乡县| 夹江县| 宾川县| 饶平县| 闸北区| 孙吴县| 濉溪县| 农安县| 庄河市| 石景山区| 肥城市| 荃湾区| 文成县| 梧州市| 渑池县| 孟州市|