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

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

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

    隨筆-71  評論-4  文章-0  trackbacks-0
    java.lang.String類對大家來說最熟悉不過了,我們寫java程序很少能不用String的。本文講述如何正確的使用String,內(nèi)容主要涉及初始化、串聯(lián)和比較等操作。
     
        首先我們必須清楚的一點是String類是final類型的,因此你不可以繼承這個類、不能修改這個類。我們使用String的時候非常簡單,通常都是String s = "hello",但是Java API中同時提供了一個構(gòu)造函數(shù)為String(String s),因此你也可以這樣使用String s = new String("hello"),對于后面這樣初始化一個String的方式是不推薦的,因為new操作符意味著將會生成一個新的對象,如果這樣的操作發(fā)生在一個循環(huán)中,那么代價是慘重的。比如
           for(int i = 0;i<1000;i++){
                 String s = new String("hello");
           }
    這將會創(chuàng)建1000個String類型的對象,由于String類是final的,因此這樣的操作事實上是每次都生成了一個新的String對象的。如果你使用String s = "hello";那么就可以實現(xiàn)復用了,為什么可以復用呢,下面會有解釋。

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

        通常對String的比較有兩種情況,一個是使用==,另一個是使用equals()方法,注意==是對對象的地址進行比較的,而String中的equals()方法是覆蓋了Object類的方法,并且實現(xiàn)為對String對象的內(nèi)容的比較。所以String s1 = new String("hello");String s2 = new String("hello"),我們對s1和s2進行上述比較的時候,前者應該返回false,因為使用new生成的是兩個不同的對象。后者應該返回true因為他們的內(nèi)容是一樣的,都是"hello"。那么如果我們還有一個String s3 = "hello";他和s1的比較應該是什么樣子的呢,答案是s1==s3為false,equals的比較為true。事實上String類是維持著一個String池的,這個池初始化為空的,當我們String x = "hello"的時候,hello就會被放入這個池中,當我們再次String y = "hello"的時候,他首先去檢查池中是否存在一個和hello內(nèi)容一樣的對象,如果存在的話就會把這個引用返回給y,如果不存在的話,就會創(chuàng)建一個并放入到池中。這樣就實現(xiàn)了復用。在String有一個方法intern()他可以把String的對象放入到池沖并返回池中的對象。如果我們對s1(String s1 = new String("hello"))調(diào)用intern,s1 = s1.intern()這時候,我們再把s1和s3進行“==”的判斷,你會發(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");

            String y="hello";
            System.out.println("s1 = y is "+(s1==y));

            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 = s3 is "+(s1==s3));
            System.out.println("s1.equals(s2) is "+s1.equals(s2));
            System.out.println("s2.equals(s3) is "+s2.equals(s3));
        }
    }
    輸出結(jié)果為

    D:\java>java   StringTest
    s1 = y is true
    s1 = s2 is false
    s2 = s3 is false
    s1 = 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 = s3 is false
    s1.equals(s2) is true
    s2.equals(s3) is true

    D:\java>

    posted on 2006-01-12 12:41 zjw_albert 閱讀(120) 評論(0)  編輯  收藏

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


    網(wǎng)站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 国产亚洲精品精华液| 国产片AV片永久免费观看| xxxxx做受大片在线观看免费| 亚洲精品无码久久| 亚洲一卡2卡3卡4卡乱码 在线| 久久亚洲AV成人无码国产| 亚洲三级电影网址| 亚洲首页在线观看| 亚洲成人免费电影| 亚洲人成影院在线高清| 亚洲国产精品久久网午夜| ww亚洲ww在线观看国产| 亚洲一区二区无码偷拍| 成a人片亚洲日本久久| 特色特黄a毛片高清免费观看| yellow视频免费看| 老司机69精品成免费视频| 88av免费观看| 野花高清在线观看免费完整版中文 | 亚洲精品456播放| 亚洲午夜日韩高清一区| 国产亚洲av片在线观看16女人| 亚洲高清国产拍精品26U| 久久久久亚洲av无码专区| 亚洲av一本岛在线播放 | 伊人久久大香线蕉亚洲| 国产aⅴ无码专区亚洲av| 亚洲av午夜成人片精品网站 | 激情综合色五月丁香六月亚洲| 亚洲日产无码中文字幕| 老司机亚洲精品影院无码| 亚洲一区二区三区高清不卡| 精品特级一级毛片免费观看| 国产福利在线观看永久免费| 久久黄色免费网站| 青青青国产在线观看免费网站| 日韩免费高清一级毛片在线| 国产亚洲精品影视在线产品| 亚洲黄色在线播放| 亚洲精品永久在线观看| 在线视频网址免费播放|