天天看點

StringBuilder、StringBuffer、String詳解StringBuilder、StringBuffer、String

StringBuilder、StringBuffer、String

String解析文章

我們來介紹字元串的另外一個類:

StringBuilder

,我們将會了解到

StringBuilder

String

的差異,

StringBuilder

的使用場景,也會介紹與

StringBuilder

類對應的

StringBuffer

類,

StringBuilder

的使用方法以及其常用方法是本小節的重點學習内容。

1. StringBuilder 概述

1.1 什麼是 StringBuilder

String

相似,

StringBuilder

也是一個與字元串相關的類,Java 官方文檔給

StringBuilder

的定義是:可變的字元序列。

1.2 為什麼需要 StringBuilder

在 Java 字元串的學習中,我們知道了字元串具有不可變性,當頻繁操作字元串時候,會在常量池中産生很多無用的資料。

StringBuilder

String

不同,它具有可變性。相較 String 類不會産生大量無用資料,性能上會大大提高。

是以對于需要頻繁操作字元串的場景,建議使用

Stringbuilder

類來代替

String

類。

2. StringBuffer 概述

2.1 定義

了解了

StringBuilder

類 ,

StringBuffer

也是不得不提的一個類,Java 官方文檔給出的定義是:線程安全的可變字元序列。

2.2 與前者的差別

StringBuffer

StringBuilder

的前身,在早期的

Java

版本中應用非常廣泛,它是

StringBuilder

的線程安全版本(線程我們将在後面的小節中介紹),但實作線程安全的代價是執行效率的下降。

你可以對比

StringBuilder

StringBuffer

的接口文檔,它們的接口基本上完全一緻。為了提升我們代碼的執行效率,在如今的實際開發中

StringBuffer

并不常用。是以本小節的重點在

StringBuilder

的學習。

3. StringBuilder 的常用方法

3.1 構造方法

StringBuilder

類提供了如下 4 個構造方法:

  1. StringBuilder()

    構造一個空字元串生成器,初始容量為 16 個字元;
  2. StringBuilder(int catpacity)

    構造一個空字元串生成器,初始容量由參數

    capacity

    指定;
  3. StringBuilder(CharSequence seq)

    構造一個字元串生成器,該生成器包含與指定的

    CharSequence

    相同的字元;
  4. StringBuilder(String str)

    構造初始化為指定字元串内容的字元串生成器。

其中第 4 個構造方法最為常用,我們可以使用

StringBuilder

這樣初始化一個内容為

hello

的字元串:

3.2 成員方法

StringBuilder

類下面也提供了很多與

String

類相似的成員方法,以友善我們對字元串進行操作。下面我們将舉例介紹一些常用的成員方法。

3.2.1 字元串連接配接

可以使用

StringBuilder

StringBuilder append(String str)

方法來實作字元串的連接配接操作。

我們知道,

String

的連接配接操作是通過

+

操作符完成連接配接的:

String str1 = "Hello";
String str2 = "World";
String str3 = str1 + " " + str2;
           

如下是通過

StringBuilder

實作的字元串連接配接示例:

public class ConnectString1 {
    public static void main(String[] args) {
        // 初始化一個内容為 Hello 的字元串生成器
        StringBuilder str = new StringBuilder("Hello");
        // 調用append()方法進行字元串的連接配接
        str.append(" ");
        str.append("World");
       	System.out.println(str);
    }
}
           

運作結果:

Hello World
           

由于

append()

方法傳回的是一個

StringBuilder

類型,我們可以實作鍊式調用。例如,上述連續兩個

append()

方法的調用語句,可以簡化為一行語句:

如果你使用 IDE 編寫如上連接配接字元串的代碼,可能會有下面這樣的提示(IntelliJ idea 的代碼截圖):

StringBuilder、StringBuffer、String詳解StringBuilder、StringBuffer、String

提示内容說可以将

StringBuilder

類型可以替換為

String

類型,也就是說可以将上邊地代碼改為:

這樣寫并不會導緻執行效率的下降,這是因為 Java 編譯器在編譯和運作期間會自動将字元串連接配接操作轉換為

StringBuilder

操作或者數組複制,間接地優化了由于

String

的不可變性引發的性能問題。

值得注意的是,

append()

的重載方法有很多,可以實作各種類型的連接配接操作。例如我們可以連接配接

char

類型以及

float

類型,執行個體如下:

public class ConnectString2 {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("小明的身高為");
        str.append(':').append(172.5f);
        System.out.println(str);
    }
}
           

運作結果:

上面代碼裡連續的兩個

append()

方法分别調用的是重載方法

StringBuilder append(char c)

StringBuilder append(float f)

3.2.2 擷取容量

可以使用

int capacity()

方法來擷取目前容量,容量指定是可以存儲的字元數(包含已寫入字元),超過此數将進行自動配置設定。注意,

容量與長度(length)不同

,長度指的是已經寫入字元的長度。

例如,構造方法

StringBuilder()

構造一個空字元串生成器,初始容量為 16 個字元。我們可以擷取并列印它的容量,執行個體如下:

public class GetCapacity {
    public static void main(String[] args) {
        // 調用StringBuilder的無參構造方法,生成一個str對象
        StringBuilder str = new StringBuilder();
        System.out.println("str的初始容量為:" + str.capacity());
        // 循環執行連接配接操作
        for (int i = 0; i < 16; i ++) {
            str.append(i);
        }
        System.out.println("連接配接操作後,str的容量為" + str.capacity());
    }
}
           

運作結果:

str的初始容量為:16
連接配接操作後,str的容量為34
           

3.2.3 字元串替換

可以使用

StringBuilder replace(int start, int end, String str)

方法,來用指定字元串替換從索引位置

start

開始到

end

索引位置結束(不包含

end

)的子串。執行個體如下:

public class StringReplace {
    public static void main(String[] args) {
        // 初始化一個内容為 Hello 的字元串生成器
        StringBuilder str = new StringBuilder("Hello World!");
        // 調用字元串替換方法,将 World 替換為 Java
        str.replace(6, 11, "Java");
        // 列印替換後的字元串
        System.out.println(str);
    }
}
           

運作結果:

也可使用

StringBuilder delete(int start, int end)

方法,先來删除索引位置

start

開始到

end

索引位置(不包含

end

)的子串,再使用

StringBuilder insert(int offset, String str)

方法,将字元串插入到序列的

offset

索引位置。同樣可以實作字元串的替換,例如:

StringBuilder str = new StringBuilder("Hello World!");
str.delete(6, 11);
str.insert(6, "Java");
           

3.2.4 字元串截取

可以使用

StringBuilder substring(int start)

方法來進行字元串截取,例如,我們想截取字元串的後三個字元,執行個體如下:

public class StringSub {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("你好,歡迎來到慕課網");
        String substring = str.substring(7);
        System.out.println("str截取後子串為:" + substring);
    }
}
           

運作結果:

str截取後子串為:慕課網
           

如果我們想截取示例中的” 歡迎 “二字,可以使用重載方法

StringBuilder substring(int start, int end)

進行截取:

3.2.5 字元串反轉

可以使用

StringBuildr reverse()

方法,對字元串進行反轉操作,例如:

public class StringReverse {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("Hello Java");
        System.out.println("str經過反轉操作後為:" + str.reverse());
    }
}
           

運作結果:

str經過反轉操作後為:avaJ olleH
           

4. 小結

本小節我們介紹了 Java 的

StringBuilder

類,它具有可變性,對于頻繁操作字元串的場景,使用它來代替

String

類可以提高程式的執行效率;也知道了

StringBuffer

StringBuilder

的線程安全版本,官方更推薦使用

StringBuilder

;最後我們介紹了

StringBuilder

的常用構造方法和成員方法。