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

首頁 > 編程 > Java > 正文

Java堆、棧、常量池、String

2019-11-11 07:51:21
字體:
供稿:網(wǎng)友
● 棧:存放基本類型的變量數(shù)據(jù)和對(duì)象的引用,但對(duì)象本身不存放在棧中,而是存放在堆(new出來的對(duì)象)或者常量池中(字符串常量對(duì)象存放在常量池中。)● 堆:存放所有new出來的對(duì)象。● 常量池:存放字符串常量和基本類型常量(public static final)。字符串常量池既不在堆中也不在棧中,是獨(dú)立的內(nèi)存空間管理(方法區(qū)中)。對(duì)于字符串:其對(duì)象的引用都是存儲(chǔ)在棧中的,如果是編譯期已經(jīng)創(chuàng)建好(直接用雙引號(hào)定義的)的就存儲(chǔ)在常量池中,如果是運(yùn)行期(new出來的)才能確定的就存儲(chǔ)在堆中。對(duì)于equals相等(僅僅是值相等)的字符串,在常量池中永遠(yuǎn)只有一份,在堆中有多份。String創(chuàng)建對(duì)象的兩種方式(1) String str = "abc";    創(chuàng)建對(duì)象的過程:    ① 首先在常量池中查找是否存在內(nèi)容為"abc"字符串對(duì)象    ② 如果不存在則在常量池中創(chuàng)建"abc",并讓str引用該對(duì)象    ③ 如果存在則直接讓str引用該對(duì)象(2) String str = new String("abc");    創(chuàng)建實(shí)例的過程:    ① 首先在堆中(不是常量池)創(chuàng)建一個(gè)指定的對(duì)象"abc",并讓str引用指向該對(duì)象    ② 在字符串常量池中查看,是否存在內(nèi)容為"abc"字符串對(duì)象    ③ 若存在,則將new出來的字符串對(duì)象與字符串常量池中的對(duì)象聯(lián)系起來    ④ 若不存在,則在字符串常量池中創(chuàng)建一個(gè)內(nèi)容為"abc"的字符串對(duì)象,并將堆中的對(duì)象與之聯(lián)系起來    intern() 方法可以返回該字符串在常量池中的對(duì)象的引用代碼測(cè)試: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); // ⑤    }}結(jié)果分析:① true    因?yàn)镾tring s4 = "ab" + "c";會(huì)先查找常量池中是否存在內(nèi)容為"abc"的字符串對(duì)象,若存在則直接讓s4引用該對(duì)象,顯然String s1 = "abc";會(huì)在常量池中創(chuàng)建"abc"對(duì)象,所以s1引用該對(duì)象,s4也引用該對(duì)象,所以S1 == S4為true。② false    因?yàn)镾tring s5 = s2 + s3;涉及到變量的相加,會(huì)產(chǎn)生新的對(duì)象,其內(nèi)部實(shí)現(xiàn)是先new一個(gè)StringBuilder,然后append(s2),append(s3),然后讓s5引用toString()返回的對(duì)象。(若想了解更多細(xì)節(jié),可以查看反編譯的代碼)。③ false    String s1 = "abc";------在常量池中建立一個(gè)"abc",s1指向"abc";引用s1存儲(chǔ)的是"abc"在常量池的地址。    String s6 = new String("abc");------在堆上分配內(nèi)存,引用s6存儲(chǔ)的是new String("abc") 在堆上的內(nèi)存地址。    還有一點(diǎn)區(qū)別是s1在類加載時(shí)就完成了初始化,而s6 要在執(zhí)行引擎執(zhí)行到那一行代碼時(shí)才完成初始化。④ true    String s7 = s6.intern();中intern 方法返回s6在常量池中的對(duì)象的引用,在字符串常量池中查看,是否存在與字符串s6的內(nèi)容"abc"相等的字符串對(duì)象,此處已經(jīng)存在String s1 = "abc";已經(jīng)存在內(nèi)容為"abc"的字符串對(duì)象。⑤ false    此處String s7 = s6.intern();等同于String s7 = "abc";    與③同理。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 蓬安县| 石门县| 民勤县| 那坡县| 沭阳县| 新建县| 神池县| 汾西县| 白河县| 东安县| 桂阳县| 伊宁市| 墨竹工卡县| 延寿县| 宁远县| 上杭县| 景泰县| 集安市| 柳林县| 密云县| 邢台市| 贡觉县| 呼和浩特市| 航空| 惠东县| 黄梅县| 兴城市| 疏附县| 临颍县| 同德县| 晋城| 新密市| 龙川县| 林州市| 兴安县| 罗源县| 固阳县| 黑龙江省| 垫江县| 高雄市| 荃湾区|