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

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

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

    posts - 6,comments - 2,trackbacks - 0

    String和StringBuffer的區別,網上資料可以說是數不勝數,但是看到這篇文章,感覺里面做的小例子很有代表性,所以轉一下,并自己做了一點總結。

    在java中有3個類來負責字符的操作。

    1.Character 是進行單個字符操作的,

    2.String 對一串字符進行操作。不可變類。

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

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

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

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

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

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

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

    1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
    2.         int times = 5000;
    3.         long lstart1 = System.currentTimeMillis();
    4.         String str = "";
    5.         for (int i = 0; i < times; i++) {
    6.             str += tempstr;
    7.         }
    8.         long lend1 = System.currentTimeMillis();
    9.         long time = (lend1 - lstart1);
    10.         System.out.println(time);

    可惜我的計算機不是超級計算機,得到的結果每次不一定一樣一般為 46687左右。
    也就是46秒。
    我們再看看以下代碼

    1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
    2.         int times = 5000;
    3.         long lstart2 = System.currentTimeMillis();
    4.         StringBuffer sb = new StringBuffer();
    5.         for (int i = 0; i < times; i++) {
    6.             sb.append(tempstr);
    7.         }
    8.         long lend2 = System.currentTimeMillis();
    9.         long time2 = (lend2 - lstart2);
    10.         System.out.println(time2);

    得到的結果為 16 有時還是 0
    所以結論很明顯,StringBuffer 的速度幾乎是String 上萬倍。當然這個數據不是很準確。因為循環的次數在100000次的時候,差異更大。不信你試試。

    根據上面所說:

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

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

    StringBuffer sb = new StringBuffer(str);

    sb.append("here");

    str = sb.toString();

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

    1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
    2.         int times = 5000;
    3.         long lstart2 = System.currentTimeMillis();
    4.         String str = "";
    5.         for (int i = 0; i < times; i++) {
    6.             StringBuffer sb = new StringBuffer(str);
    7.             sb.append(tempstr);
    8.             str = sb.toString();
    9.         }
    10.         long lend2 = System.currentTimeMillis();
    11.         long time2 = (lend2 - lstart2);
    12.         System.out.println(time2);

    平均執行時間為46922左右,也就是46秒。

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

    ===========================================================================================


    自從Java 5.0發布以后,我們的比較列表上將多出一個對象了,這就是StringBuilder類。String類是不可變類,任何對String的改變都會引發新的String對象的生成;而StringBuffer則是可變類,任何對它所指代的字符串的改變都不會產生新的對象,可變和不可變類這一對對象已經齊全了,那么為什么還要引入新的StringBuilder類干嗎?相信大家都有此疑問,我也如此。下面,我們就來看看引入該類的原因。

          為什么會出現那么多比較String和StringBuffer的文章?

          原因在于當改變字符串內容時,采用StringBuffer能獲得更好的性能。既然是為了獲得更好的性能,那么采用StringBuffer能夠獲得最好的性能嗎?

          答案是NO!

          為什么?

          如果你讀過《Think in Java》,而且對里面描述HashTable和HashMap區別的那部分章節比較熟悉的話,你一定也明白了原因所在。對,就是支持線程同步保證線程安全而導致性能下降的問題。HashTable是線程安全的,很多方法都是synchronized方法,而HashMap不是線程安全的,但其在單線程程序中的性能比HashTable要高。StringBuffer和StringBuilder類的區別也在于此,新引入的StringBuilder類不是線程安全的,但其在單線程中的性能比StringBuffer高。如果你對此不太相信,可以試試下面的例子:

    package com.hct.test;

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;

    /**
    * @author: chengtai.he
    * @created:2009-12-9 上午09:59:57
    */
    public class StringBuilderTester {
    private static final String base = " base string. ";
    private static final int count = 2000000;

    public static void stringTest() {
      long begin, end;
      begin = System.currentTimeMillis();
      String test = new String(base);
      for (int i = 0; i < count/100; i++) {
       test = test + " add ";
      }
      end = System.currentTimeMillis();
      System.out.println((end - begin)
        + " millis has elapsed when used String. ");
    }

    public static void stringBufferTest() {
      long begin, end;
      begin = System.currentTimeMillis();
      StringBuffer test = new StringBuffer(base);
      for (int i = 0; i < count; i++) {
       test = test.append(" add ");
      }
      end = System.currentTimeMillis();
      System.out.println((end - begin)
        + " millis has elapsed when used StringBuffer. ");
    }

    public static void stringBuilderTest() {
      long begin, end;
      begin = System.currentTimeMillis();
      StringBuilder test = new StringBuilder(base);
      for (int i = 0; i < count; i++) {
       test = test.append(" add ");
      }
      end = System.currentTimeMillis();
      System.out.println((end - begin)
        + " millis has elapsed when used StringBuilder. ");
    }

    public static String appendItemsToStringBuiler(List list) {
      StringBuilder b = new StringBuilder();

      for (Iterator i = list.iterator(); i.hasNext();) {
       b.append(i.next()).append(" ");
      }

      return b.toString();
    }

    public static void addToStringBuilder() {
      List list = new ArrayList();
      list.add(" I ");
      list.add(" play ");
      list.add(" Bourgeois ");
      list.add(" guitars ");
      list.add(" and ");
      list.add(" Huber ");
      list.add(" banjos ");

      System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));
    }

    public static String appendItemsToStirngBuffer(List list) {
      StringBuffer b = new StringBuffer();

      for (Iterator i = list.iterator(); i.hasNext();) {
       b.append(i.next()).append(" ");
      }

      return b.toString();
    }

    public static void addToStringBuffer() {
      List list = new ArrayList();
      list.add(" I ");
      list.add(" play ");
      list.add(" Bourgeois ");
      list.add(" guitars ");
      list.add(" and ");
      list.add(" Huber ");
      list.add(" banjos ");

      System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));
    }

    public static void main(String[] args) {
      stringTest();
      stringBufferTest();
      stringBuilderTest();
      addToStringBuffer();
      addToStringBuilder();
    }
    }

    上面的程序結果如下:
    5266 millis has elapsed when used String.
    375 millis has elapsed when used StringBuffer.
    281 millis has elapsed when used StringBuilder.
    I   play   Bourgeois   guitars   and   Huber   banjos 
    I   play   Bourgeois   guitars   and   Huber   banjos
    從上面的結果來看,這三個類在單線程程序中的性能差別一目了然,采用String對象時,即使運行次數僅是采用其他對象的1/100,其執行時間仍然比其他對象高出25倍以上;而采用StringBuffer對象和采用StringBuilder對象的差別也比較明顯,前者是后者的1.5倍左右。由此可見,如果我們的程序是在單線程下運行,或者是不必考慮到線程同步問題,我們應該優先使用StringBuilder類;當然,如果要保證線程安全,自然非StringBuffer莫屬了。

    除了對多線程的支持不一樣外,這兩個類的使用幾乎沒有任何差別,上面的例子就是個很好的說明。appendItemsToStringBuiler和appendItemsToStirngBuffer兩個方法除了采用的對象分別為StringBuilder和StringBuffer外,其他完全相同,而效果也完全相同。


    posted on 2012-09-24 09:44 achan2bj 閱讀(135) 評論(0)  編輯  收藏 所屬分類: java SE
    主站蜘蛛池模板: 精品国产一区二区三区免费看| 国产精品亚洲综合| 亚洲乱码中文字幕久久孕妇黑人| 无码视频免费一区二三区 | 成人毛片免费观看视频大全| 在线涩涩免费观看国产精品| 一区二区免费国产在线观看| 亚洲日本在线电影| 亚洲av专区无码观看精品天堂| 亚洲好看的理论片电影| 亚洲乱码国产一区三区| 亚洲一级片免费看| 免费日本黄色网址| 好爽好紧好大的免费视频国产| 美女网站免费福利视频| 久久国产精品成人片免费| 免费在线观影网站| 韩日电影在线播放免费版| 一区二区3区免费视频| 美女被爆羞羞网站免费 | 国产成人免费片在线视频观看| 成人人免费夜夜视频观看| 在线a免费观看最新网站| 一级毛片免费观看不卡的| 日本高清高色视频免费| 182tv免费视频在线观看| 国产午夜精品久久久久免费视 | 67194在线午夜亚洲| 久久久久亚洲AV无码永不| 国产日韩亚洲大尺度高清| 国产成A人亚洲精V品无码性色| 亚洲午夜国产精品无码| 亚洲精品乱码久久久久久按摩| 国产亚洲人成无码网在线观看| 久久精品国产精品亚洲精品| 精品亚洲综合在线第一区| 亚洲av无码一区二区三区网站 | 曰批全过程免费视频在线观看无码| 中文字幕在线观看免费| 国产在线观看免费视频软件 | 亚洲av日韩av无码|