<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    例子說(shuō)明String的堆(heap)棧(stack)信息

         String是一個(gè)特殊的包裝類數(shù)據(jù)。即可以用String str = new String("abc");的形式來(lái)創(chuàng)建,也可以用String str = "abc";的形式來(lái)創(chuàng)建。前者是規(guī)范的類的創(chuàng)建過(guò)程,即在Java中,一切都是對(duì)象,而對(duì)象是類的實(shí)例,全部通過(guò)new()的形式來(lái)創(chuàng)建。Java 中的有些類,如DateFormat類,可以通過(guò)該類的getInstance()方法來(lái)返回一個(gè)新創(chuàng)建的類,似乎違反了此原則。其實(shí)不然。該類運(yùn)用了單 例模式來(lái)返回類的實(shí)例,只不過(guò)這個(gè)實(shí)例是在該類內(nèi)部通過(guò)new()來(lái)創(chuàng)建的,而getInstance()向外部隱藏了此細(xì)節(jié)。那為什么在String str = "abc";中,并沒(méi)有通過(guò)new()來(lái)創(chuàng)建實(shí)例,是不是違反了上述原則?其實(shí)沒(méi)有。

      關(guān)于String str = "abc"的內(nèi)部工作。Java內(nèi)部將此語(yǔ)句轉(zhuǎn)化為以下幾個(gè)步驟:
    (1)先定義一個(gè)名為str的對(duì)String類的對(duì)象引用變量:String str;
    (2)在棧中查找有沒(méi)有存放值為"abc"的地址,如果沒(méi)有,則開(kāi)辟一個(gè)存放字面值為"abc"的地址,接著創(chuàng)建一個(gè)新的String類的對(duì)象o,并 將o 的[url=]字符串[/url]值指向這個(gè)地址,而且在棧中這個(gè)地址旁邊記下這個(gè)引用的對(duì)象o。如果已經(jīng)有了值為"abc"的地址,則查找對(duì)象o,并返 回o的地址。
    (3)將str指向?qū)ο髈的地址。
    值得注意的是,一般String類中字符串值都是直接存值的。但像String str = "abc";這種場(chǎng)合下,其字符串值卻是保存了一個(gè)指向存在棧中數(shù)據(jù)的引用!
      
    為了更好地說(shuō)明這個(gè)問(wèn)題,我們可以通過(guò)以下的幾個(gè)代碼進(jìn)行驗(yàn)證。

    String str1 = "abc";
    String str2 = "abc";
    System.out.println(str1==str2);  //true
       
    注意,我們這里并不用str1.equals(str2);的方式,因?yàn)檫@將比較兩個(gè)字符串的值是否相等。==號(hào),根據(jù)JDK的說(shuō)明,只有在兩個(gè)引用都指向了同一個(gè)對(duì)象時(shí)才返回真值。而我們?cè)谶@里要看的是,str1與str2是否都指向了同一個(gè)對(duì)象。
        圖解:
        
    結(jié)果說(shuō)明,JVM創(chuàng)建了兩個(gè)引用str1和str2,但只創(chuàng)建了一個(gè)對(duì)象,而且兩個(gè)引用都指向了這個(gè)對(duì)象。

    我們?cè)賮?lái)更進(jìn)一步,將以上代碼改成:

    String str1 = "abc";
    String str2 = "abc";
    str1 = "bcd";
    System.out.println(str1 + "," + str2);  //bcd, abc
    System.out.println(str1==str2);  //false

    這就是說(shuō),賦值的變化導(dǎo)致了類對(duì)象引用的變化,str1指向了另外一個(gè)新對(duì)象!而str2仍舊指向原來(lái)的對(duì)象。上例中,當(dāng)我們將str1的值改為"bcd"時(shí),JVM發(fā)現(xiàn)在棧中沒(méi)有存放該值的地址,便開(kāi)辟了這個(gè)地址,并創(chuàng)建了一個(gè)新的對(duì)象,其字符串的值指向這個(gè)地址。
    事實(shí)上,String類被設(shè)計(jì)成為不可改變(immutable)的類。如果你要改變其值,可以,但JVM在運(yùn)行時(shí)根據(jù)新值悄悄創(chuàng)建了一個(gè)新對(duì)象,然 后將這個(gè)對(duì)象的地址返回給原來(lái)類的引用。這個(gè)創(chuàng)建過(guò)程雖說(shuō)是完全自動(dòng)進(jìn)行的,但它畢竟占用了更多的時(shí)間。在對(duì)時(shí)間要求比較敏感的環(huán)境中,會(huì)帶有一定的不良 影響。

    再修改原來(lái)代碼:

    String str1 = "abc";
    String str2 = "abc";
      
    str1 = "bcd";
      
    String str3 = str1;
    System.out.println(str3);  //bcd

    String str4 = "bcd";
    System.out.println(str1 == str4);  //true
       
       
    str3 這個(gè)對(duì)象的引用直接指向str1所指向的對(duì)象(注意,str3并沒(méi)有創(chuàng)建新對(duì)象)。當(dāng)str1改完其值后,再創(chuàng)建一個(gè)String的引用str4,并指向 因str1修改值而創(chuàng)建的新的對(duì)象??梢园l(fā)現(xiàn),這回str4也沒(méi)有創(chuàng)建新的對(duì)象,從而再次實(shí)現(xiàn)棧中數(shù)據(jù)的共享。

    我們?cè)俳又匆韵碌拇a。

    String str1 = new String("abc");
    String str2 = "abc";
    System.out.println(str1==str2);  //false



    創(chuàng)建了兩個(gè)引用。創(chuàng)建了兩個(gè)對(duì)象。兩個(gè)引用分別指向不同的兩個(gè)對(duì)象。

    String str1 = "abc";
    String str2 = new String("abc");
    System.out.println(str1==str2);  //false

    創(chuàng)建了兩個(gè)引用。創(chuàng)建了兩個(gè)對(duì)象。兩個(gè)引用分別指向不同的兩個(gè)對(duì)象。

    以上兩段代碼說(shuō)明,只要是用new()來(lái)新建對(duì)象的,都會(huì)在堆中創(chuàng)建,而且其字符串是單獨(dú)存值的,即使與棧中的數(shù)據(jù)相同,也不會(huì)與棧中的數(shù)據(jù)共享。

    posted on 2008-09-04 14:22 nonels 閱讀(502) 評(píng)論(0)  編輯  收藏 所屬分類: J2SE

    <2008年9月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(2)

    隨筆分類(16)

    隨筆檔案(16)

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲αⅴ无码乱码在线观看性色| 亚洲视频一区在线播放| 亚洲gay片在线gv网站| xxxxwww免费| 亚洲一级毛片免观看| 日韩不卡免费视频| 亚洲国产成人久久精品app| 亚洲电影免费观看| 久久久久久久99精品免费| 国产亚洲综合色就色| 一级特黄aa毛片免费观看| 亚洲天堂视频在线观看| 久久久久免费看成人影片| 猫咪免费人成网站在线观看| 亚洲精品国产成人专区| 亚洲一级毛片免费观看| 亚洲精品国产精品国自产网站 | 色片在线免费观看| 亚洲日产2021三区| 一个人看的在线免费视频| 在线观看亚洲天天一三视| 日韩免费在线视频| 亚洲人成日本在线观看| 啦啦啦在线免费视频| 亚洲专区先锋影音| 在线观看免费人成视频色9| 精品久久久久久亚洲综合网| 国产亚洲自拍一区| 50岁老女人的毛片免费观看| 亚洲国产系列一区二区三区 | 亚洲人AV永久一区二区三区久久| 国产日韩久久免费影院| 4480yy私人影院亚洲| 好爽好紧好大的免费视频国产| 一级人做人a爰免费视频| 亚洲精品中文字幕乱码| 四虎永久免费影院在线| 久久久久免费看黄a级试看| 亚洲日本久久久午夜精品| 亚洲综合av永久无码精品一区二区 | 成人激情免费视频|