隨筆-9  評論-0  文章-0  trackbacks-0

          String和StringBuffer的區(qū)別,網(wǎng)上資料可以說是數(shù)不勝數(shù),但是看到這篇文章,感覺里面做的小例子很有代表性,所以轉(zhuǎn)一下,并自己做了一點總結(jié)。

           

          在java中有3個類來負(fù)責(zé)字符的操作。

          1.Character 是進(jìn)行單個字符操作的,

          2.String 對一串字符進(jìn)行操作。不可變類。

          3.StringBuffer 也是對一串字符進(jìn)行操作,但是可變類。

          String:
          是對象不是原始類型.
          為不可變對象,一旦被創(chuàng)建,就不能修改它的值.
          對于已經(jīng)存在的String對象的修改都是重新創(chuàng)建一個新的對象,然后把新的值保存進(jìn)去.
          String 是final類,即不能被繼承.

          StringBuffer:
          是一個可變對象,當(dāng)對他進(jìn)行修改的時候不會像String那樣重新建立對象
          它只能通過構(gòu)造函數(shù)來建立,
          StringBuffer sb = new StringBuffer();
          note:不能通過付值符號對他進(jìn)行付值.
          sb = "welcome to here!";//error
          對象被建立以后,在內(nèi)存中就會分配內(nèi)存空間,并初始保存一個null.向StringBuffer
          中付值的時候可以通過它的append方法.
          sb.append("hello");

          字符串連接操作中StringBuffer的效率要比String高:

          String str = new String("welcome to ");
          str += "here";
          的處理步驟實際上是通過建立一個StringBuffer,讓侯調(diào)用append(),最后
          再將StringBuffer toSting();
          這樣的話String的連接操作就比StringBuffer多出了一些附加操作,當(dāng)然效率上要打折扣.

          并且由于String 對象是不可變對象,每次操作Sting 都會重新建立新的對象來保存新的值.
          這樣原來的對象就沒用了,就要被垃圾回收.這也是要影響性能的.

          看看以下代碼:
          將26個英文字母重復(fù)加了5000次,

                  String tempstr = "abcdefghijklmnopqrstuvwxyz";
                  int times = 5000;
                  long lstart1 = System.currentTimeMillis();
                  String str = "";
                  for (int i = 0; i < times; i++) {
                      str += tempstr;
                  }
                  long lend1 = System.currentTimeMillis();
                  long time = (lend1 - lstart1);
                  System.out.println(time);
          可惜我的計算機不是超級計算機,得到的結(jié)果每次不一定一樣一般為 46687左右。
          也就是46秒。
          我們再看看以下代碼

                  String tempstr = "abcdefghijklmnopqrstuvwxyz";
                  int times = 5000;
                  long lstart2 = System.currentTimeMillis();
                  StringBuffer sb = new StringBuffer();
                  for (int i = 0; i < times; i++) {
                      sb.append(tempstr);
                  }
                  long lend2 = System.currentTimeMillis();
                  long time2 = (lend2 - lstart2);
                  System.out.println(time2);
          得到的結(jié)果為 16 有時還是 0
          所以結(jié)論很明顯,StringBuffer 的速度幾乎是String 上萬倍。當(dāng)然這個數(shù)據(jù)不是很準(zhǔn)確。因為循環(huán)的次數(shù)在100000次的時候,差異更大。不信你試試。

           

          根據(jù)上面所說:

          str += "here";
          的處理步驟實際上是通過建立一個StringBuffer,讓侯調(diào)用append(),最后
          再將StringBuffer toSting();

          所以str += "here";可以等同于

          StringBuffer sb = new StringBuffer(str);

          sb.append("here");

          str = sb.toString();

          所以上面直接利用"+"來連接String的代碼可以基本等同于以下代碼

                  String tempstr = "abcdefghijklmnopqrstuvwxyz";
                  int times = 5000;
                  long lstart2 = System.currentTimeMillis();
                  String str = "";
                  for (int i = 0; i < times; i++) {
                      StringBuffer sb = new StringBuffer(str);
                      sb.append(tempstr);
                      str = sb.toString();
                  }
                  long lend2 = System.currentTimeMillis();
                  long time2 = (lend2 - lstart2);
                  System.out.println(time2);
          平均執(zhí)行時間為46922左右,也就是46秒。

           

          總結(jié): 如果在程序中需要對字符串進(jìn)行頻繁的修改連接操作的話.使用StringBuffer性能會更高

          posted on 2010-01-21 17:22 AndyFish 閱讀(155) 評論(0)  編輯  收藏 所屬分類: 基礎(chǔ)知識

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 洪洞县| 东城区| 玉门市| 准格尔旗| 杭锦旗| 托里县| 长海县| 清远市| 桂阳县| 昌吉市| 科技| 花莲市| 凌海市| 肃宁县| 论坛| 房产| 鲜城| 和林格尔县| 隆回县| 万安县| 磴口县| 温宿县| 商城县| 瑞昌市| 和硕县| 资兴市| 兴隆县| 射洪县| 长治市| 安阳县| 喀什市| 交口县| 襄樊市| 同仁县| 长治市| 广平县| 宁德市| 武夷山市| 宝丰县| 永川市| 蒙山县|