轉 : 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代碼
- public class MainClass {
-
- public static void main(String[] arg) {
- StringBuffer aString = new StringBuffer("ABCDE");
-
- String phrase = "abced";
- StringBuffer buffer = new StringBuffer(phrase);
-
- System.out.println(aString);
- System.out.println(buffer);
- }
- }
上面的代碼中,我們用已有的字串對象new了兩個StringBuffer對象然後我們直接將他們作為參數傳遞給println方法。這裡我們可以看出,它們實際上輸出的是StringBuffer代表的字串。其實我們在用StringBuffer構造字串的時候,到最後還是會調用toString方法來擷取輸出,從而獲得我們實際要用的字串。
好了,既然講到了,順便給大家一個將StringBuffer轉換為字串的例子,很簡單:
Java代碼
- public class MainClass {
-
- public static void main(String[] arg) {
- StringBuffer palindrome = new StringBuffer("so many dynamos");
-
-
- String aString = palindrome.toString();
-
- System.out.println(aString);
-
- }
-
- }
看到了吧,其實我們在日常的開發中,尤其是使用StringBuffer來拼SQL的時候,經常用的就是toString方法了。
從上面的構造方法中,我們可以看到,在構造一個StringBuffer對象的時候還可以指定StringBuffer的容量,它是用int來指定的,上面的API中也可以看出,如果不指定則預設為16個字元。好了給出一個例子:
Java代碼
- public class MainClass {
-
- public static void main(String[] arg) {
- StringBuffer newString = new StringBuffer(50);
-
- System.out.println(newString.capacity());
- }
- }
上面的例子中,我們構造了一個StringBuffer對象,並給它的容量賦值為50,這樣如果我們後面添加的字元少於50,那麼就不會出現新擴容量的情況。上面的例子還可以看出,我們可以調用capacity來擷取當前的StringBuffer對象的容量資訊。下面做個例子來看看StringBuffer容量的變化情況:
Java代碼
- /**
- * User: zhangtao
- * Date: 2009-3-2
- * Time: 16:24:36
- */
- public class StringBufferDemo {
- public static void main(String[] args){
- StringBuffer sb = new StringBuffer();//預設容量為16
- System.out.println(sb.capacity());//輸出16
- sb.append("123456789012345");
- System.out.println(sb.capacity());//輸出16
- sb.append("6");
- System.out.println(sb.capacity());//輸出16
- sb.append("789111");
- System.out.println(sb.capacity());//輸出34
- }
- }
最後一個輸出的依據是這樣的:int newCapacity = (value.length + 1) * 2;這個是內部計算的依據,也就是在超出後,會先計算本身的容量,然後加1,再乘2,所以輸出的是17*2 = 34了。有了這個公式,相信大家會知道下一個容量是多少了,沒錯,是70.
好了,這一講給大家講的有點多,先到這裡,下面會詳細的講解其他方法給大家。