String和StringBuffer

          Posted on 2006-07-19 11:56 firslien 閱讀(284) 評(píng)論(0)  編輯  收藏
          其實(shí)這兩個(gè)概念并不是很難理解,但是網(wǎng)上很多文章都講得有點(diǎn)復(fù)雜,有的提到用反匯編器來(lái)看程序執(zhí)行過(guò)程,的確這是一個(gè)好辦法,很清楚.但是對(duì)于一個(gè)初學(xué)者來(lái)說(shuō)確實(shí)看不懂,反而還會(huì)使得他覺(jué)得這兩個(gè)概念很難理解,越搞越亂.

          下面我就來(lái)說(shuō)下我經(jīng)過(guò)對(duì)網(wǎng)上資料的整理寫(xiě)了一篇對(duì)String和StringBuffer的簡(jiǎn)單看法:


          1. String類(lèi)一旦建立是不可修改的??屬于字符串常量[/size]
          ??
          ?? StringBuffer類(lèi) 是可以修改的
          ??
          通過(guò)下面這個(gè)例子我們就能很清楚地了解:

          public class compare
          {
          ?????? public static void main(String args[])
          ?????? {
          ???????????? String s1="a";
          ???????????? StringBuffer sb1=new StringBuffer("a");
          ??
          ???????????? StringBuffer sb2=sb1;
          ???????????? String s2="a"+"b";
          ???????????? sb1.append("b");
          ????
          ???????????? System.out.println(s1==s2);
          ???????????? System.out.println(sb1==sb2);
          ??????????????
          ???????????? System.out.println(s1);
          ??
          ??????????}
          }

          ?????????? 運(yùn)行結(jié)果:
          ?????????? false
          ?????????? true
          ?????????? a

          ??????這樣我們可以看出來(lái)用String來(lái)聲明的變量是不可變的,即使我們使用了sb1.append("b");這樣一個(gè)語(yǔ)句,但是從輸出結(jié)果可以看出s1仍然是a并沒(méi)有發(fā)生改變。 而StringBuffer聲明的變量是可以改變的所以運(yùn)行結(jié)果是true。

          2.對(duì)字符串使用==來(lái)進(jìn)行比較String的特殊性
          用==來(lái)比較字符串,與equalse方法不同的是,==不是比較兩個(gè)字符串的值是否相等,而是比較幾個(gè)字符串的引用是否指向同一個(gè)實(shí)例。
          public class c2
          {
          ??????????public static void main(String args[])
          ??????{
          ??????????String s1="a";
          ??????????String s2="a";
          ??????????String s3=new String("a");
          ??????????String s4=new String("a");

          ??????????System.out.println(s1==s2);
          ??????????System.out.println(s3==s4);
          ??????????System.out.println(s1==s3);
          ??
          ??????}
          ????上面的程序段輸出:
          ?? true
          ????false
          ????false


          ????????
          ???????? 與上例進(jìn)行比較,不僅可以看出來(lái)==與equals的區(qū)別,還可以看到字面量的String的特殊之外。
          ??????對(duì)于字面量的String,只要字符串的值是相等的,不論有多少個(gè)引用都是指向同一塊內(nèi)存,不再另外分配空間。而用new關(guān)鍵字生成的實(shí)例則不同,每當(dāng)用new實(shí)例化一次,分配該實(shí)例自己的內(nèi)存空間。



          3.字符串equals()的比較方法
          ?????? String類(lèi)提供了一些方法,用來(lái)進(jìn)行字符串的比較。這個(gè)類(lèi)實(shí)現(xiàn)了Object父類(lèi)的equals()方法,用來(lái)比較兩種字符串的值是否相等。同時(shí)還增加了equalsIgnoreCase()方法可以忽略?xún)蓚€(gè)字符串大小寫(xiě)的區(qū)別。下面是這兩種方法的例子。

          public class b1
          {
          ??????public static void main(String args[])
          ?? {
          ???????? String s1="a";
          ???????? String s2=new String("a");
          ???????? String s3="A";
          ???????? System.out.println(s1.equals(s2));
          ???????? System.out.println(s1.equals(s3));
          ???????? System.out.println(s1.equalsIgnoreCase(s3));
          ????}
          }

          上例的輸出是:
          true
          flase
          true

          但是StringBuffer類(lèi)并沒(méi)有實(shí)現(xiàn)Objcet類(lèi)的Equals方法,所以不能用這個(gè)方法來(lái)比較兩個(gè)StringBuffer類(lèi)的字符串是否相等,如下例所示。

          public class b2
          {
          ?????????? public static void main(String args[])
          ????????????{
          ???????????????? StringBuffer s1=new StringBuffer("a");
          ???????????????? StringBuffer s2=new StringBuffer("a");
          ???????????????? System.out.println(s1.equals(s2));
          ??
          ???????????? }
          }
          程序輸出:false
          但是StringBuffer類(lèi)并沒(méi)有實(shí)現(xiàn)Objcet類(lèi)的Equals方法,所以不能用這個(gè)方法來(lái)比較兩個(gè)StringBuffer類(lèi)的字符串是否相等.

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 高邑县| 黄大仙区| 长武县| 三原县| 定州市| 冷水江市| 双辽市| 胶南市| 平江县| 三原县| 改则县| 科尔| 万安县| 嘉定区| 横峰县| 芜湖市| 赞皇县| 红桥区| 前郭尔| 大英县| 从江县| 麦盖提县| 万宁市| 宾阳县| 奉化市| 河东区| 色达县| 芜湖市| 乐都县| 临沭县| 沁源县| 泸溪县| 康保县| 湖州市| 织金县| 皮山县| 山阴县| 正定县| 萝北县| 洞头县| 沈丘县|