1. 程式人生 > 其它 >java—StringBuffer和StringBuilder

java—StringBuffer和StringBuilder

技術標籤:JAVA字串java資料結構

1. String、StringBuffer、StringBuilder三者的異同?

  • String:不可變的字元序列;底層使用char[]儲存
  • StringBuffer:可變的字元序列;執行緒安全的,效率低 (因為使用了synchronized) ;底層使用char[]儲存
  • StringBuilder:可變的字元序列;jdk5.0新增的,執行緒不安全的,效率高;底層使用char[]儲存

2. StringBuffer類:

其可變的字元序列體現在:

  • 例如下面示例,對於String,因為儲存在final的char[]中,具有不可變性。其常用方法都是直接返回一個新的String物件,原本的物件不會改變。
  • 但是StringBuffer型別的物件,其setCharAt()方法是void的,直接可以在原儲存區域更改該物件某個位置的值。
  • 注意宣告StringBuffer型別的物件時不能用 StringBuffer sb = "abc"; 這是對於String型別可以使用的,從而儲存在常量池中。
package day3;

public class stringtest1 {
    public static void main(String[] args){

        StringBuffer sb = new StringBuffer("abc");
        sb.setCharAt(0, 'A');
        System.out.println(sb);//Abc

        String s = "abc";
        String s1 = s.replace('a','A');
        System.out.println(s);//abc
        System.out.println(s1);//Abc

    }
}

3. String和StringBuffer和StringBuilder區別的原始碼分析

  • String str = new String(); 原始碼中:char[] str = new char[0];
  • String str= new String("abc"); 原始碼中:char[] str = new char[]{'a','b','c'};
  • String str= "abc"; 原始碼中:final char[] str = new char[]{'a','b','c'};

  • StringBuffer str = new StringBuffer(); 原始碼中:char[] str = new char[16]; 建立了長度為16的char[]。如果容量不夠用就擴容。
  • StringBuffer str = new StringBuffer("abc"); 原始碼中:char[] str = new char[16+str.length()]; 建立了長度為19的char[]。相當於多擴容了16個位置。
  • 對於StringBuffer的 str,雖然建立時都多擴容了16個位置,但是str.length()還是實際長度
  • 對於StringBuffer str = new StringBuffer(); 這種構造方式,因為一開始預設建立16個容量的char[],再之後新增元素的時候如果超出容量,要重新建立一個長度等於原來容量的2倍 + 2的char[],再把原來的陣列複製到新陣列中。我們推薦利用StringBuffer str = new StringBuffer(int capacity); StringBuiler str = new StringBuiler(int capacity);這種構造方式,避免複製等操作。
  • StringBuffer和StringBuilder在上面原始碼是一樣的,都是可變的。

4. StringBuffer和StringBuiler的常用方法:(StringBuffer和StringBuiler的常用方法一樣,只介紹StringBuffer)

注意void型別的方法都是直接對原字串進行修改,有返回值的就是沒修改原來的字串,而是返回一個新的字串

StringBuffer append(xxx):提供了很多的append()方法,用於進行字串拼接
StringBuffer delete(int start,int end):刪除指定位置的內容,左閉右開
StringBuffer replace(int start, int end, String str):把[start,end)位置替換為str
StringBuffer insert(int offset, xxx):在指定位置插入xxx,xxx支援多種基本資料型別轉化為string
StringBuffer reverse() :把當前字元序列逆轉

public int indexOf(String str)  返回str在原字串中出現的位置
public String substring(int start,int end):返回一個從start開始到end索引結束的左閉右開區間的子字串
public int length()
public char charAt(int n )
public void setCharAt(int n ,char ch)

總結:
   增:append(xxx)
   刪:delete(int start,int end)
   改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
   查:charAt(int n )
   插:insert(int offset, xxx)
   長度:length();

示例:對於StringBuffer s = new StringBuffer("hello");

  • 自動將基本資料型別轉成string後增加到最後。
  • s1.append(1); //hello1
  • s1.append('1');//hello1
  • s1.append(false);//hellofalse
  • s1.append(11.01);//hello11.01
  • s1.delete(2,4); //heo 左閉右開
  • s1.replace(2,4,"aa");// heaao
  • s1.insert(1,1); // h1ello
  • s1.reverse(); // olleh

5. String和StringBuffer和StringBuilder的效率

對比String、StringBuffer、StringBuilder三者的效率:“注意這裡string是用字面量的方式建立”
從高到低排列:StringBuilder > StringBuffer > String

String最低的原因是不可變,所以每次操作都是需要重新在常量池裡建立。