1. 程式人生 > >Java基礎類庫之StringBuffer類

Java基礎類庫之StringBuffer類

導語

很多新手都搞不懂String、StringBuffer、StringBuilder之間到底有什麼區別,那就一點一點來說一下吧。

主要內容

  • StringBuffer類的主要特點
  • StringBuffer、StringBuilder、String的區別

具體內容

String類

String類的特點:
- String類物件有兩種例項化方式:
- 直接賦值:只開闢一塊堆記憶體空間,可以自動入池。
- 構造方法:開闢兩塊堆記憶體空間,不會自動入池,使用intern()手工入池。
- 任何一個字串都是String類的匿名物件。
- 字串一旦宣告則不可改變,可以改變的只是String類物件的引用。

雖然在所有的專案裡面,String類都一定要使用,可是String類有一個問題不得不進行重複,那麼就是String類的內容不可改變。為此在Java裡面提供有另一個類——StringBuffer類(內容可修改)。

StringBuffer類

String類的物件可以使用“+”進行字串的連線操作,但是在StringBuffer類裡面必須使用append()方法進行追加:
- public StringBuffer append(資料型別 變數)

範例:觀察StringBuffer基本使用

public class TestDemo {
    public static void
main(String args[]) { // String類可以直接賦值例項化,但是StringBuffer類不行 StringBuffer buf = new StringBuffer(); buf.append("Hello ").append("World ").append("!!!"); change(buf); // 引用傳遞 System.out.println(buf); } public static void change(StringBuffer temp) { temp.append("\n"
).append("Hello MLDN ."); } }

輸出結果

Hello World !!!
Hello MLDN .

發現StringBuffer類的內容是可以進行修改的,而String的內容是不可以修改的。

觀察兩個類的區別:

String類: StringBuffer類:
public final class String extends Object implements Serializable, Comparable, CharSequence{} public final class StringBuffer extends Object implements Serializable, CharSequence{}

發現String與StringBuffer都是CharSequence介面的子類。而在以後的開發之中,如果看到某些方法出現的是CharSequence介面,那麼應該清楚,只需要傳遞字串即可。

CharSequence seq = "Hello";  // 向上轉型
System.out.println(seq);  // String類覆寫的toString()

雖然String和StringBuffer類有著共同的介面,但是這兩個類物件之間如果要轉換不能夠直接轉換。
- 將String物件轉換為StringBuffer物件:
- 方法一:利用StringBuffer類的構造方法(public StringBuffer(String str))。
- 方法二:利用append()方法(public StringBuffer append(String str))。
- 將StringBuffer物件轉換為String物件:
- 利用toString()方法可以將StringBuffer轉換為String。
- 也可以利用String類的構造方法轉換(public String(StringBuffer buffer)。

在String類裡面也提供有與StringBuffer比較的方法:public boolean contentEquals(StringBuffer sb)。

StringBuffer buf = new StringBuffer("Hello");
System.out.println("hello".contentEquals(buf));
System.out.println("Hello".contentEquals(buf));

輸出結果

false
true

String類之中定義了許多的方法便於使用者的開發,而在StringBuffer類裡面也定義了許多的操作方法,而且部分方法與String類是正好互補的。
- 字串反轉:public StringBuffer reverse()。
- 在指定的索引位置增加資料:public StringBuffer insert(int offset, 資料型別 變數)。
- 刪除部分資料:public StringBuffer delete(int start, int end)。

StringBuffer buf1 = new StringBuffer("Hello");
System.out.println(buf.reverse());
buf.insert(0, "MLDN ").insert(0, "你好 ");

StringBuffer buf2 = new StringBuffer("Hello");
System.out.println(buf);

StringBuffer buf3 = new StringBuffer("Hello World MLDN");
System.out.println(buf.delete(5, 11));

輸出結果

olleH
你好 MLDN Hello
Hello MLDN

StringBuffer、StringBuilder、String的區別

從JDK1.5之後增加了一個新的字串操作類:StringBuilder類,這個類的定義結構如下:

public final class StringBuffer extends Object 
implements Serializable, CharSequence{}

發現StringBuffer類與StringBuilder類在定義上非常的相似,幾乎連方法也一樣。

檢視原始碼,發現StringBuffer的方法前都有synchronized關鍵字。

**面試題:**String、StringBuffer、StringBuilder的區別?
- String的內容一旦宣告則不可改變,而StringBuffer與StringBuilder宣告的內容可以改變。
- StringBuffer類中提供的方法都是同步方法,屬於安全的執行緒操作,而StringBuilder類中的方法都屬於非同步方法,屬於非執行緒安全的操作。

在開發之中,如果見到了字串的應用,一般使用String類,只有在需要字串頻繁修改的時候才會考慮使用到StringBuffer或者是StringBuilder類操作。

總結

String類依然是最常用的字串描述類,而StringBuffer類由於出現時間較長,所以使用要比StringBuilder多。