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

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

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

    Java基礎問題:java.lang.String - intern()

    Posted on 2006-03-02 20:56 killvin 閱讀(919) 評論(0)  編輯  收藏 所屬分類: java

    原文: http://forum.javaeye.com/viewtopic.php?t=17912


    摟主的問題問的含含糊糊:flyjie給出了非常詳細的解釋,
    不過就是沒有解釋String實例化的特殊方面以及Intern()方法的含義

    -------
    ---------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------
    java代碼:
    String str ;

    這樣聲明str它只支是一個對象的reference,不會產(chǎn)生實際的對象。如果沒有初始化str,編譯時便會發(fā)生錯誤。
    java代碼:
    String str1=new String("test");
    String str2 = "test";

    str1是一個新的對象。new關鍵字的意思就是創(chuàng)建某個新的對象。而str2是一個對象的引用。 它們的內(nèi)容相同,但內(nèi)存地址是不一樣的。 java中對象的引用存在Stack(棧)中,而對象由Heap(堆)分配空間。

    3、引用==變量?  不一定
    java代碼:

      public class TestString {
    public static void main(String[] args) {
    String s1 = "test";
    String s2 = new String("test");
    if (s1 == s2)
    System.out.println("s1 == s2");
    else
    System.out.println("s1 != s2");
    if (s1.equals(s2))
    System.out.println("s1 equals s2");
    else System.out.println("s1 not equals s2");
    }
    }

    我們將 s2 用 new 操作符創(chuàng)建程序輸出:s1 != s2 s1 equals s2.
    java代碼:

    s2 = s2.intern();

    在你加上這句話后,上面的程序輸入:s1 == s2 s1 equals s2

    而String a = "test" ; String b = "test" ; a == b 會返回true; 這里a="test"時創(chuàng)建一個在棧中的reference, b=test時jvm發(fā)現(xiàn)棧中已存在名為"test"的字符串,直接引用。結(jié)論:String 是個對象,要對比兩個不同的String對象的值是否相同明顯的要用到 equals() 這個方法. 而== 比較的是內(nèi)存地址的值。

    4、private final String a = "test", 這個a屬于常量,存放在常量存儲空間(CS)中。

    5、建議你看看<<深入淺出java虛擬機>>一書。

    -------
    ---------------------------------------------------------------------------------
    ---------------------------------------------------------------------------------



    總結(jié)

    1. 在學習JAVA的時候就知道==比較的是內(nèi)存地址.而equals比較的是內(nèi)存地址對應的值!(可是還是有很多的人問來問去的,真不知道他們JAVA的基礎課程是怎么學的?!)

    2. JAVA所有的對象都是存放在堆中的!你獲取的"對象"僅僅只是對象的引用而已

    3. String是比較特殊的對象,特殊在
    3.1 > String a = new String("test") -此時你是在堆中實例化了一個字符串對象
    3.2 > String b = "test"-此時JVM會先去堆中尋找這樣的對象;如果有就返回此對象的引用;如果沒有就重新實例化一個這樣的對象!基于這樣的一個過程所以JAVA要求String不可以更改值的。

    3.3 >intern()方法就是試圖完成這樣的一個尋找過程
    When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

    這里有一份詳細的參考資料:

    關于Java棧與堆的思考 http://www.javafan.net/article/20051123115654293.html


    主站蜘蛛池模板: 毛色毛片免费观看| 免费国产黄网站在线观看可以下载| 很黄很黄的网站免费的| 久久精品国产亚洲香蕉| 亚洲日韩精品一区二区三区无码| 老司机免费午夜精品视频| 免费一区二区视频| 一级毛片免费播放试看60分钟| 免费在线观看黄网| 国产高清视频免费在线观看| 国产亚洲精品久久久久秋霞| 免费在线观影网站| 亚洲午夜精品久久久久久人妖 | 老湿机一区午夜精品免费福利| 国产片免费福利片永久| 美女被免费视频网站a| 亚洲美女又黄又爽在线观看| 国产va在线观看免费| 一二三四在线播放免费观看中文版视频 | 亚洲国产精品日韩在线| 亚洲综合免费视频| 亚洲老熟女@TubeumTV| 无码国产精品一区二区免费式直播 | 亚洲AV人无码综合在线观看| 久久永久免费人妻精品| 亚洲免费电影网站| 免费乱码中文字幕网站| 一区二区三区无码视频免费福利| 国产精品亚洲A∨天堂不卡| 99热精品在线免费观看| 亚洲偷自拍另类图片二区| 久久精品无码专区免费东京热 | 国产美女精品视频免费观看| 免费国产va视频永久在线观看| 亚洲无人区午夜福利码高清完整版 | 久久成人永久免费播放| 91亚洲国产在人线播放午夜| 午夜寂寞在线一级观看免费| 好男人资源在线WWW免费| 亚洲www77777| 亚洲日韩欧洲乱码AV夜夜摸|