1. 程式人生 > >StringBuffer對String型別的操作

StringBuffer對String型別的操作

String類是所有專案開發中一定會用到的一個功能類,並且這個類擁有如下的特點:

  • 每一個字串的常量都屬於一個String類的匿名物件,並且不可更改;
  • String有兩個常量池:靜態常量池、執行時常量池
  • String類物件例項化建議使用直接賦值的形式完成,這樣可以直接將物件儲存在物件池之中以方便下次重用。

雖然String類很好使用,但是如果認真去思考也會發現其最大的弊端:內容不允許修改,雖然大部分情況下我們都不會涉及到字串內容的頻繁修改,但是依然會存在這樣的情況,多以為了解決此問題,專門提供了一個StirngBuffer類實現字串內容的修改處理。
**範例:**觀察String與StringBuffer的對比
Stirng類物件的引用傳遞:

public class JavaApi {
    public static void main(String[] args) {
        String str = "Hello ";
        change(str);
        System.out.println(str);    //內容沒有發生改變
    }
    public static void change(String temp){
        temp += "world";
    }
}

StirngBuffer並不像Stirng類那樣有兩種物件例項化,StringBuffer必須像普通類那樣首先進行物件例項化,而後在才可以呼叫方法進行處理,而這個時候可以呼叫StringBuffer類中的如下方法:

  • 構造方法: public StirngBuilder(){};
  • 構造方法: public StringBuilder(String str){};
  • 資料追加: public StringBuilder append(資料型別 變數);相當於字串的加操作。

StringBuffer類引用傳遞:

public class JavaApi {
    public static void main(String[] args) {
        StringBuffer btf = new StringBuffer("Hello ");
        change(btf);
        System.out.println(btf);    //內容沒有發生改變
    }
    public static void change(StringBuffer temp){
       temp.append("world !");
    }
}

大多數情況下,很少會出現有字串內容的改變,這種改變指的並不是針對於靜態常量池的改變:
**範例:**分析一下已有問題

 public static void main(Stirng[] args){
    Stirng strA = "www.baidu.com";
    String strB = "www." + "mldn" +".com";
    System.out.println(strA == strB);
 }

這個時候的strB物件內容的改變不算改變,從更加嚴格的意義上來講,對於現在的strB當程式編譯之後會變為如下形式:

    String strB = "www." + "mldn" +".com";
StringBuffer buf = new StringBuffer();
buf.append("www.").append("mldn").append(".com);

所有的“+”在編譯之後都變為了StirngBuffer中的append()方法,並且在程式中StirngBuffer與String類物件之間可以互相轉換:

  • String類物件變為StringBuffer可以依靠StringBuffer的構造方法或者append()方法
  • 所有的類物件都可以通過toStirng()方法變為String物件。
    在StringBufferl類裡面除了有字串修改以外,實際上也提供了一些其他的方法:
    1、插入資料: publc StirngBuffer insert(int offset,資料型別 變數);
public static void main(String[] args) {
        StringBuffer btf = new StringBuffer();
         btf.append(".com").insert(0,"www.").insert(4,"baidu");
        System.out.println(btf);    //內容沒有發生改變
    }

2、刪除指定範圍的資料: public StringBuffer delete(int start,int end);

    public static void main(String[] args) {
        StringBuffer btf = new StringBuffer();
         btf.append("hello world").delete(6,12).insert(6,"baidu");
        System.out.println(btf);    //內容沒有發生改變
    }

3、字串內容的反轉

 public static void main(String[] args) {
        StringBuffer btf = new StringBuffer();
         btf.append("hello world");
        System.out.println(btf.reverse());    //內容沒有發生改變
    }

實際上與StringBuffer類還有一個類似的功能類:StringBuilder類,這個類是JDK1.5的時候提供的,該類中提供的方法,與StringBuffer的功能相同,最大的區別在於StringBuffer類中的方法屬於執行緒安全的,全部方法使用synchronized關鍵字標註,而StringBuilder類屬於非執行緒安全的。

**面試題:請解釋String、StringBuffer、StringBuilder的區別?

  • Stirng類是字串的首選型,其最大特點是內容不允許修改;
  • StringBuffer和StringBuilder類的內容可以進行修改;
  • StringBuffer是在JDK1.0的時候提供的,屬於執行緒安全的操作,StringBuilder是在JDK1.5的時候提供的,屬於非執行緒安全的操作。