第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開(kāi)發(fā)者教程

StringBuilder

上一節(jié),我們學(xué)習(xí)了 Java 的 String 類,并介紹了其常用方法。本小節(jié)我們來(lái)介紹字符串的另外一個(gè)類:StringBuilder,我們將會(huì)了解到 StringBuilderString差異,StringBuilder使用場(chǎng)景,也會(huì)介紹與 StringBuilder 類對(duì)應(yīng)的 StringBuffer 類,StringBuilder使用方法以及其常用方法是本小節(jié)的重點(diǎn)學(xué)習(xí)內(nèi)容。

1. StringBuilder 概述

1.1 什么是 StringBuilder

String 相似,StringBuilder 也是一個(gè)與字符串相關(guān)的類,Java 官方文檔給 StringBuilder 的定義是:可變的字符序列。

1.2 為什么需要 StringBuilder

在 Java 字符串的學(xué)習(xí)中,我們知道了字符串具有不可變性,當(dāng)頻繁操作字符串時(shí)候,會(huì)在常量池中產(chǎn)生很多無(wú)用的數(shù)據(jù)(回憶圖示)。

StringBuilderString 不同,它具有可變性。相較 String 類不會(huì)產(chǎn)生大量無(wú)用數(shù)據(jù),性能上會(huì)大大提高。

因此對(duì)于需要頻繁操作字符串的場(chǎng)景,建議使用 Stringbuilder 類來(lái)代替 String 類。

2. StringBuffer 概述

2.1 定義

了解了 StringBuilder 類 ,StringBuffer 也是不得不提的一個(gè)類,Java 官方文檔給出的定義是:線程安全的可變字符序列。

2.2 與前者的區(qū)別

StringBufferStringBuilder 的前身,在早期的 Java 版本中應(yīng)用非常廣泛,它是 StringBuilder 的線程安全版本(線程我們將在后面的小節(jié)中介紹),但實(shí)現(xiàn)線程安全的代價(jià)是執(zhí)行效率的下降

你可以對(duì)比 StringBuilderStringBuffer接口文檔,它們的接口基本上完全一致。為了提升我們代碼的執(zhí)行效率,在如今的實(shí)際開(kāi)發(fā)中 StringBuffer 并不常用。因此本小節(jié)的重點(diǎn)在 StringBuilder 的學(xué)習(xí)。

3. StringBuilder 的常用方法

3.1 構(gòu)造方法

StringBuilder 類提供了如下 4 個(gè)構(gòu)造方法:

  1. StringBuilder() 構(gòu)造一個(gè)空字符串生成器,初始容量為 16 個(gè)字符;
  2. StringBuilder(int catpacity) 構(gòu)造一個(gè)空字符串生成器,初始容量由參數(shù) capacity 指定;
  3. StringBuilder(CharSequence seq) 構(gòu)造一個(gè)字符串生成器,該生成器包含與指定的 CharSequence 相同的字符。;
  4. StringBuilder(String str) 構(gòu)造初始化為指定字符串內(nèi)容的字符串生成器。

其中第 4 個(gè)構(gòu)造方法最為常用,我們可以使用 StringBuilder 這樣初始化一個(gè)內(nèi)容為 hello 的字符串:

StringBuilder str = new StringBuilder("Hello");

3.2 成員方法

StringBuilder 類下面也提供了很多與 String 類相似的成員方法,以方便我們對(duì)字符串進(jìn)行操作。下面我們將舉例介紹一些常用的成員方法。

3.2.1 字符串連接

可以使用 StringBuilderStringBuilder append(String str) 方法來(lái)實(shí)現(xiàn)字符串的連接操作。

我們知道,String 的連接操作是通過(guò) + 操作符完成連接的:

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

如下是通過(guò) StringBuilder 實(shí)現(xiàn)的字符串連接示例:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
public class ConnectString1 {
    public static void main(String[] args) {
        // 初始化一個(gè)內(nèi)容為 Hello 的字符串生成器
        StringBuilder str = new StringBuilder("Hello");
        // 調(diào)用append()方法進(jìn)行字符串的連接
        str.append(" ");
        str.append("World");
       	System.out.println(str);
    }
}
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

運(yùn)行結(jié)果:

Hello World

由于 append() 方法返回的是一個(gè) StringBuilder 類型,我們可以實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用。例如,上述連續(xù)兩個(gè) append() 方法的調(diào)用語(yǔ)句,可以簡(jiǎn)化為一行語(yǔ)句:

str.append(" ").append("World");

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

提示內(nèi)容說(shuō)可以將 StringBuilder 類型可以替換為 String 類型,也就是說(shuō)可以將上邊地代碼改為:

String str = "Hello" + " " + "World";

這樣寫(xiě)并不會(huì)導(dǎo)致執(zhí)行效率的下降,這是因?yàn)?Java 編譯器在編譯和運(yùn)行期間會(huì)自動(dòng)將字符串連接操作轉(zhuǎn)換為 StringBuilder 操作或者數(shù)組復(fù)制,間接地優(yōu)化了由于 String 的不可變性引發(fā)的性能問(wèn)題。

值得注意的是,append() 的重載方法有很多,可以實(shí)現(xiàn)各種類型的連接操作。例如我們可以連接 char 類型以及 float 類型,實(shí)例如下:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
public class ConnectString2 {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("小明的身高為");
        str.append(':').append(172.5f);
        System.out.println(str);
    }
}
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

運(yùn)行結(jié)果:

小明的身高為:172.5

上面代碼里連續(xù)的兩個(gè) append() 方法分別調(diào)用的是重載方法 StringBuilder append(char c)StringBuilder append(float f)

3.2.2 獲取容量

可以使用 int capacity() 方法來(lái)獲取當(dāng)前容量,容量指定是可以存儲(chǔ)的字符數(shù)(包含已寫(xiě)入字符),超過(guò)此數(shù)將進(jìn)行自動(dòng)分配。注意,容量與長(zhǎng)度(length)不同,長(zhǎng)度指的是已經(jīng)寫(xiě)入字符的長(zhǎng)度。

例如,構(gòu)造方法 StringBuilder() 構(gòu)造一個(gè)空字符串生成器,初始容量為 16 個(gè)字符。我們可以獲取并打印它的容量,實(shí)例如下:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
public class GetCapacity {
    public static void main(String[] args) {
        // 調(diào)用StringBuilder的無(wú)參構(gòu)造方法,生成一個(gè)str對(duì)象
        StringBuilder str = new StringBuilder();
        System.out.println("str的初始容量為:" + str.capacity());
        // 循環(huán)執(zhí)行連接操作
        for (int i = 0; i < 16; i ++) {
            str.append(i);
        }
        System.out.println("連接操作后,str的容量為" + str.capacity());
    }
}
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

運(yùn)行結(jié)果:

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

3.2.3 字符串替換

可以使用 StringBuilder replace(int start, int end, String str) 方法,來(lái)用指定字符串替換從索引位置 start 開(kāi)始到 end 索引位置結(jié)束(不包含 end)的子串。實(shí)例如下:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
public class StringReplace {
    public static void main(String[] args) {
        // 初始化一個(gè)內(nèi)容為 Hello 的字符串生成器
        StringBuilder str = new StringBuilder("Hello World!");
        // 調(diào)用字符串替換方法,將 World 替換為 Java
        str.replace(6, 11, "Java");
        // 打印替換后的字符串
        System.out.println(str);
    }
}
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

運(yùn)行結(jié)果:

Hello Java!

也可使用 StringBuilder delete(int start, int end) 方法,先來(lái)刪除索引位置 start 開(kāi)始到 end 索引位置(不包含 end)的子串,再使用 StringBuilder insert(int offset, String str) 方法,將字符串插入到序列的 offset 索引位置。同樣可以實(shí)現(xiàn)字符串的替換,例如:

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

3.2.4 字符串截取

可以使用 StringBuilder substring(int start) 方法來(lái)進(jìn)行字符串截取,例如,我們想截取字符串的后三個(gè)字符,實(shí)例如下:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
public class StringSub {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("你好,歡迎來(lái)到慕課網(wǎng)");
        String substring = str.substring(7);
        System.out.println("str截取后子串為:" + substring);
    }
}
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

運(yùn)行結(jié)果:

str截取后子串為:慕課網(wǎng)

如果我們想截取示例中的” 歡迎 “二字,可以使用重載方法 StringBuilder substring(int start, int end) 進(jìn)行截?。?/p>

String substring = str.substring(3, 5);

3.2.5 字符串反轉(zhuǎn)

可以使用 StringBuildr reverse() 方法,對(duì)字符串進(jìn)行反轉(zhuǎn)操作,例如:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
public class StringReverse {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("Hello Java");
        System.out.println("str經(jīng)過(guò)反轉(zhuǎn)操作后為:" + str.reverse());
    }
}
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

運(yùn)行結(jié)果:

str經(jīng)過(guò)反轉(zhuǎn)操作后為:avaJ olleH

4. 小結(jié)

本小節(jié)我們介紹了 Java 的 StringBuilder 類,它具有可變性,對(duì)于頻繁操作字符串的場(chǎng)景,使用它來(lái)代替 String 類可以提高程序的執(zhí)行效率;也知道了 StringBufferStringBuilder 的線程安全版本,官方更推薦使用 StringBuilder;最后我們介紹了 StringBuilder 的常用構(gòu)造方法和成員方法,如果你想了解更多關(guān)于 StringBuilder 的接口,可以翻閱官方文檔進(jìn)行學(xué)習(xí)。