Java開發 之 StringBuffer和StringBuilder(1)

來源:互聯網
上載者:User
轉 : http://www.jcourse.cn/read/2342009-03-02 作者:

zhangtaolv

在我們日常開發中,經常會遇到對文本的操作,並且在一般的MIS系統中,文本操作尤為多,如使用者名稱、文章內容、文章標題、合約內容等。在之前的教程中,我也給大家講解了Java中最基本的字串操作的類,String。在之前的教程中我也給大家講了String是不可變的類,即在構造後其內容不能變化,因此對於內容頻繁變動(如我們對文章進行編輯)來說String是不合適的。那麼遇到這樣的情況時,我們該如何處理呢?Java為我們提供了StringBuilder和StringBuffer。

首先講講它們的共同點吧!基本上我們在字串經常發生改變的時候使用它們,然後使用它們來操作會比使用String類要快些。這兩個類的區別是StringBuffer是安全執行緒的而StringBuilder是非安全執行緒的。

在大致講解後,我們看看如何由已有的字串對象來建立StringBuffer和將StringBuffer轉換為String對象。

先給出StringBuffer類的構造方法的API,讓我們看看有多少種方式來構造它。

構造方法摘要
StringBuffer() 
          構造一個其中不帶字元的字串緩衝區,其初始容量為 16 個字元。
StringBuffer(CharSequence seq) 
          public java.lang.StringBuilder(CharSequence seq) 構造一個字串緩衝區,它包含與指定的 CharSequence相同的字元。
StringBuffer(int capacity) 
          構造一個不帶字元,但具有指定初始容量的字串緩衝區。
StringBuffer(String str) 
          構造一個字串緩衝區,並將其內容初始化為指定的字串內容。
 

可以看出,我們可以直接new一個,也可以在new的時候給出參數。這裡的參數可以是一個字串,可以是一個容量值,也可以是一個CharSequence。我們首先看看用已有的字串來構造StringBuffer。下面是一個例子:

Java代碼
  1. public class MainClass {   
  2.   
  3.   public static void main(String[] arg) {   
  4.     StringBuffer aString = new StringBuffer("ABCDE");   
  5.   
  6.     String phrase = "abced";   
  7.     StringBuffer buffer = new StringBuffer(phrase);   
  8.   
  9.     System.out.println(aString);   
  10.     System.out.println(buffer);   
  11.   }   
  12. }   

上面的代碼中,我們用已有的字串對象new了兩個StringBuffer對象然後我們直接將他們作為參數傳遞給println方法。這裡我們可以看出,它們實際上輸出的是StringBuffer代表的字串。其實我們在用StringBuffer構造字串的時候,到最後還是會調用toString方法來擷取輸出,從而獲得我們實際要用的字串。

好了,既然講到了,順便給大家一個將StringBuffer轉換為字串的例子,很簡單:

Java代碼
  1. public class MainClass {   
  2.   
  3.   public static void main(String[] arg) {   
  4.     StringBuffer palindrome = new StringBuffer("so many dynamos");   
  5.   
  6.   
  7.     String aString = palindrome.toString();   
  8.   
  9.     System.out.println(aString);   
  10.   
  11.   }   
  12.   
  13. }  

看到了吧,其實我們在日常的開發中,尤其是使用StringBuffer來拼SQL的時候,經常用的就是toString方法了。

從上面的構造方法中,我們可以看到,在構造一個StringBuffer對象的時候還可以指定StringBuffer的容量,它是用int來指定的,上面的API中也可以看出,如果不指定則預設為16個字元。好了給出一個例子:

Java代碼
  1. public class MainClass {   
  2.   
  3.   public static void main(String[] arg) {   
  4.     StringBuffer newString = new StringBuffer(50);   
  5.        
  6.     System.out.println(newString.capacity());   
  7.   }   
  8. }   

上面的例子中,我們構造了一個StringBuffer對象,並給它的容量賦值為50,這樣如果我們後面添加的字元少於50,那麼就不會出現新擴容量的情況。上面的例子還可以看出,我們可以調用capacity來擷取當前的StringBuffer對象的容量資訊。下面做個例子來看看StringBuffer容量的變化情況:

Java代碼
  1. /**  
  2.  * User: zhangtao  
  3.  * Date: 2009-3-2  
  4.  * Time: 16:24:36  
  5.  */  
  6. public class StringBufferDemo {   
  7.     public static void main(String[] args){   
  8.         StringBuffer sb = new StringBuffer();//預設容量為16   
  9.         System.out.println(sb.capacity());//輸出16   
  10.         sb.append("123456789012345");   
  11.         System.out.println(sb.capacity());//輸出16   
  12.         sb.append("6");   
  13.         System.out.println(sb.capacity());//輸出16   
  14.         sb.append("789111");   
  15.         System.out.println(sb.capacity());//輸出34   
  16.     }   
  17. }   

最後一個輸出的依據是這樣的:int newCapacity = (value.length + 1) * 2;這個是內部計算的依據,也就是在超出後,會先計算本身的容量,然後加1,再乘2,所以輸出的是17*2 = 34了。有了這個公式,相信大家會知道下一個容量是多少了,沒錯,是70.

好了,這一講給大家講的有點多,先到這裡,下面會詳細的講解其他方法給大家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.