StringBuilder與StringBuffer的區別)

來源:互聯網
上載者:User
相信大家看到過很多比較String和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外,其他完全相同,而效果也完全相同。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.