posts - 6,  comments - 8,  trackbacks - 0

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

          為什么c是false?

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

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

          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操作符意味著將會在heap上生成一個新的對象,如果這樣的操作發(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)復(fù)用了,為什么可以復(fù)用呢,下面會有解釋。

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

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 翁源县| 交城县| 明光市| 葫芦岛市| 昔阳县| 靖江市| 枣强县| 监利县| 津市市| 突泉县| 长治市| 和林格尔县| 荣成市| 衡东县| 文成县| 柳河县| 调兵山市| 壶关县| 榕江县| 隆昌县| 垫江县| 永泰县| 双江| 龙里县| 滨海县| 平凉市| 抚州市| 西吉县| 土默特右旗| 东方市| 临城县| 金溪县| 百色市| 长白| 新巴尔虎右旗| 娄烦县| 轮台县| 专栏| 洛浦县| 邢台县| 甘孜|