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

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

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

    posts - 6,  comments - 8,  trackbacks - 0

    例如 String a=new String("a");
    String b="a";
    boolean c=(a==b);

    為什么c是false?

    String 類不是采用共享設(shè)計(jì)模式嗎。同樣的字符串應(yīng)該引用的是同樣的地址。可為什么是false呢?

    如果是
     String a="a";
    String b="a";
    boolean c=(a==b);
    這個(gè)時(shí)候b就是true了

    java.lang.String類對(duì)大家來(lái)說(shuō)最熟悉不過(guò)了,我們寫java程序很少能不用String的。本文講述如何正確的使用String,內(nèi)容主要涉及初始化、串聯(lián)和比較等操作。

        首先我們必須清楚的一點(diǎn)是String類是final類型的,因此你不可以繼承這個(gè)類、不能修改這個(gè)類。我們使用String的時(shí)候非常簡(jiǎn)單,通常都是 String s = "hello",但是Java API中同時(shí)提供了一個(gè)構(gòu)造函數(shù)為String(String s),因此你也可以這樣使用String s = new String("hello"),對(duì)于后面這樣初始化一個(gè)String的方式是不推薦的,因?yàn)閚ew操作符意味著將會(huì)在heap上生成一個(gè)新的對(duì)象,如果這樣的操作發(fā)生在一個(gè)循環(huán)中,那么代價(jià)是慘重的。比如
    for(int i = 0;i<1000;i++)
    {
        String s = new String("hello");
    }
        這將會(huì)創(chuàng)建1000個(gè)String類型的對(duì)象,由于String類是final的,因此這樣的操作事實(shí)上是每次都生成了一個(gè)新的String對(duì)象的。如果你使用String s = "hello";那么就可以實(shí)現(xiàn)復(fù)用了,為什么可以復(fù)用呢,下面會(huì)有解釋。

        當(dāng)我們使用"+"實(shí)現(xiàn)串聯(lián)操作的時(shí)候,比如String s = "hello"+"world";其實(shí)是通過(guò)StringBuffer類的append()方法實(shí)現(xiàn)的,最后返回String給s。如果有興趣的話,你可以寫一個(gè)簡(jiǎn)單的例子,然后用javap看看虛擬機(jī)是如何工作的。在使用串聯(lián)的時(shí)候我們同樣應(yīng)該注意String是final類,如果你需要多次串聯(lián)比如:
    String sql = "xxx";
    sql = "xxxx";
    sql = "ssssss";
    那么為了提高效率節(jié)省空間,我們應(yīng)該自己用StringBuffer來(lái)替代"+";

        通常對(duì)String的比較有兩種情況,一個(gè)是使用==,另一個(gè)是使用equals()方法,注意==是對(duì)對(duì)象的地址進(jìn)行比較的,而String中的 equals()方法是覆蓋了Object類的方法,并且實(shí)現(xiàn)為對(duì)String對(duì)象的內(nèi)容的比較。所以String s1 = new String("hello");String s2 = new String("hello"),我們對(duì)s1和s2進(jìn)行上述比較的時(shí)候,前者應(yīng)該返回false,因?yàn)槭褂胣ew生成的是兩個(gè)不同的對(duì)象。后者應(yīng)該返回 true因?yàn)樗麄兊膬?nèi)容是一樣的,都是"hello"。那么如果我們還有一個(gè)String s3 = "hello";他和s1的比較應(yīng)該是什么樣子的呢,答案是s1==s3為false,equals的比較位true。事實(shí)上String類是維持著一個(gè) String池的,這個(gè)池初始化為空的,當(dāng)我們String x = "hello"的時(shí)候,hello就會(huì)被放入這個(gè)池中,當(dāng)我們?cè)俅蜸tring y = "hello"的時(shí)候,他首先去檢查池中是否存在一個(gè)和hello內(nèi)容一樣的對(duì)象,如果存在的話就會(huì)把這個(gè)引用返回給y,如果不存在的話,就會(huì)創(chuàng)建一個(gè)并放入到池中。這樣就實(shí)現(xiàn)了復(fù)用。在String有一個(gè)方法intern()他可以把String的對(duì)象放入到池沖并返回池中的對(duì)象。如果我們對(duì) s1(String s1 = new String("hello"))調(diào)用intern,s1 = s1.intern()這時(shí)候,我們?cè)侔裺1和s3進(jìn)行“==”的判斷,你會(huì)發(fā)現(xiàn)結(jié)果返回true!
        看下面的例子

    public class StringTest
    {

        public static void main(String[] args)
        {
            String s1 = "hello";
            String s2 = new String("hello");
            String s3 = new String("hello");
          
            testString(s1,s2,s3);
            s2 = s2.intern();
            System.out.println("after s2.intern");
            testString(s1,s2,s3);  

         }
           private static void testString(String s1,String s2,String s3)
        {
            System.out.println("s1 = s2 is "+(s1==s2));
            System.out.println("s2 = s3 is "+(s2==s3));
            System.out.println("s1.equals(s2) is "+s1.equals(s2));
            System.out.println("s2.equals(s3) is "+s2.equals(s3));
        }
    }
    輸出結(jié)果為
    s1 = s2 is false
    s2 = s3 is false
    s1.equals(s2) is true
    s2.equals(s3) is true
    after s2.intern
    s1 = s2 is true
    s2 = s3 is false
    s1.equals(s2) is true
    s2.equals(s3) is true

    posted on 2010-04-07 22:34 張貝貝 閱讀(1024) 評(píng)論(1)  編輯  收藏

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久久久亚洲?V成人无码| 国产又大又粗又硬又长免费| 久久国产亚洲精品麻豆| fc2成年免费共享视频18| 日产国产精品亚洲系列| 国产偷国产偷亚洲高清人| 国产免费久久精品| 黄色一级毛片免费| 亚洲精品无码久久久| 无码人妻一区二区三区免费视频| 免费A级毛片无码A| 国产亚洲日韩在线a不卡| 四虎影视在线永久免费看黄| 羞羞漫画页面免费入口欢迎你| 免费又黄又硬又爽大片| 国产JIZZ中国JIZZ免费看| 亚洲日韩精品一区二区三区 | 中中文字幕亚洲无线码| 永久免费av无码不卡在线观看| 亚洲神级电影国语版| 成人毛片18女人毛片免费| 亚洲AV性色在线观看| 亚洲国产精品人人做人人爱| 免费国产污网站在线观看| 亚洲精品不卡视频| 国产精品深夜福利免费观看| 一个人看的www视频免费在线观看| 亚洲人成人一区二区三区| 免费成人福利视频| 国产成人亚洲精品播放器下载| 亚洲日韩精品一区二区三区无码| 91久久青青草原线免费| 久久精品国产亚洲av品善| 在线精品亚洲一区二区小说| 182tv免费视视频线路一二三| 亚洲精品无码一区二区 | 亚洲国产精品日韩| 亚洲大片免费观看| 美女免费精品高清毛片在线视| 亚洲大片在线观看| 免费观看国产小粉嫩喷水|