Java中字符串StringBuffer和StringBuilder的使用

Java中表示字符串的有三個類:String、StringBuffer和StringBuilder。其中,String的長度是不可變的,而StringBuffer和StringBuilder是長度可變的。對於StringBuffer和StringBuilder來說,兩者的API幾乎一模一樣,因為兩者有共同的父類:AbstractStringBuilder。區別在於StringBuffer的大部分方法都是被synchronized關鍵字修飾,是線程安全的,而StringBuilder則與其相反。

所以本篇就對StringBuffer和StringBuilder類比著來進行介紹。

  • 構造器

StringBuffer和StringBuilder的構造器都有三個,分別如下:

StringBuffer的構造器:

  1. new StringBuffer(int capacity)
  2. new StringBuffer(String str)
  3. new StringBuffer(CharSequence seq)

StringBuilder的構造器:

  1. new StringBuilder(int capacity)
  2. new StringBuilder(String str)
  3. new StringBuilder(CharSequence seq)

對比兩者構造器發現,它們對構造器的重載都施行了同樣的方式,可以傳入一個整數的容量,可以傳一個字符串值,甚至可以傳一個字符序列的對象。對於Java來說,常用的字符序列對象就是我們認知中的String, StringBuffer和StringBuilder。關於StringBuilder和StringBuffer的使用的示例代碼如下所示:

<code>

public

class

StringTest

{

public

static

void

main

(

String[] args

) throws IOException

{ StringBuffer strBuffer =

new

StringBuffer(

16

); System.

out

.println(

"strBuffer:"

+ strBuffer +

", 容量為:"

+ strBuffer.capacity() +

", 長度為:"

+ strBuffer.length()); StringBuilder strBuilder =

new

StringBuilder(

16

); System.

out

.println(

"strBuilder:"

+ strBuilder +

", 容量為:"

+ strBuilder.capacity() +

", 長度為:"

+ strBuilder.length()); StringBuffer strBuffer2 =

new

StringBuffer(

"how are you"

); System.

out

.println(

"strBuffer2的值為:"

+ strBuffer2 +

", 容量為:"

+ strBuffer2.capacity() +

", 長度為:"

+ strBuffer2.length()); StringBuilder strBuilder2 =

new

StringBuilder(

"how old are you"

); System.

out

.println(

"strBuilder2的值為:"

+ strBuilder2 +

", 容量為:"

+ strBuilder2.capacity() +

", 長度為:"

+ strBuilder2.length()); StringBuilder strBuffer3 =

new

StringBuilder(strBuilder); System.

out

.println(

"strBuffer3的值為:"

+ strBuffer3 +

", 容量為:"

+ strBuffer3.capacity() +

", 長度為:"

+ strBuffer3.length()); StringBuilder strBuilder3 =

new

StringBuilder(strBuffer2); System.

out

.println(

"strBuilder3的值為:"

+ strBuilder3 +

", 容量為:"

+ strBuilder3.capacity() +

", 長度為:"

+ strBuilder3.length()); } }/<code>

執行結果如下圖所示:

Java中字符串StringBuffer和StringBuilder的使用

  • 拼接參數

拼接參數常用的方法方法如下圖:

Java中字符串StringBuffer和StringBuilder的使用

也就是說,該方法可以拼接所有的基本數據類型和其對應的包裝類型,字符數組、字符序列對象及其他的引用對象等。

StringBuilder和StringBuffer的append

其示例代碼如下所示:

<code>public class StringTest {

    public static void main(String[] args) throws IOException {

         
        StringBuilder strBuilder = 

new

StringBuilder(); StringBuffer strBuffer =

new

StringBuffer(); strBuilder.

append

(

12

).

append

(

","

); strBuffer.

append

(

12

).

append

(

","

); strBuilder.

append

(

13

L).

append

(

","

); strBuffer.

append

(

13

L).

append

(

","

); strBuilder.

append

(

3.4

f).

append

(

","

); strBuffer.

append

(

3.4

f).

append

(

","

); strBuilder.

append

(

3.5

).

append

(

","

); strBuffer.

append

(

3.5

).

append

(

","

); strBuilder.

append

(

"hello"

.toCharArray()).

append

(

","

); strBuffer.

append

(

"hello"

.toCharArray()).

append

(

","

); strBuilder.

append

(

new

Date()).

append

(

","

); strBuffer.

append

(

new

Date()).

append

(

","

); strBuilder.

append

(

"hello"

.toCharArray(),

2

,

2

).

append

(

","

); strBuffer.

append

(

"hello"

.toCharArray(),

2

,

2

).

append

(

","

); strBuilder.

append

(

"hello"

,

1

,

3

).

append

(

","

); strBuffer.

append

(

"hello"

,

1

,

3

).

append

(

","

); printStrBuilder(strBuilder); printStrBuffer(strBuffer); } private static void printStrBuilder(StringBuilder strBuilder) { String[] strArr = strBuilder.deleteCharAt(strBuilder.length() -

1

).toString().split(

","

); System.out.

println

(

"StringBuilder信息為:\n"

+ Arrays.asList(strArr)); } private static void printStrBuffer(StringBuffer strBuffer) { String[] strArr = strBuffer.deleteCharAt(strBuffer.length() -

1

).toString().split(

","

); System.out.

println

(

"StringBuffer信息為:\n"

+ Arrays.asList(strArr)); } } /<code>

只想結果如下圖所示:

Java中字符串StringBuffer和StringBuilder的使用

  • 獲取某個字符串在另一個字符串中的索引位置

這裡使用的方法有四個,如下圖:

Java中字符串StringBuffer和StringBuilder的使用

相關的示例代碼如下所示:

<code>

public

class

StringTest

{

public

static

void

main

(

String[] args

) throws IOException

{ StringBuilder strBuilder =

new

StringBuilder(

"no zuo no die no happy no problem"

); StringBuffer strBuffer =

new

StringBuffer(

"no zuo no die no happy no problem"

); System.

out

.println(

""no"在strBuilder中首次出現的位置為:"

+ strBuilder.indexOf(

"no"

)); System.

out

.println(

""no"在strBuffer中首次出現的位置為:"

+ strBuffer.indexOf(

"no"

)); System.

out

.println(

""no"在strBuilder中在索引3之後首次出現的位置為:"

+ strBuilder.indexOf(

"no"

,

3

)); System.

out

.println(

""no"在strBuffer中在索引3之後首次出現的位置為:"

+ strBuffer.indexOf(

"no"

,

3

)); System.

out

.println(

""no"在strBuilder中最後出現的位置為:"

+ strBuilder.lastIndexOf(

"no"

)); System.

out

.println(

""no"在strBuffer中最後出現的位置為:"

+ strBuffer.lastIndexOf(

"no"

)); System.

out

.println(

""no"在strBuilder中在索引20之前最後出現的位置為:"

+ strBuilder.lastIndexOf(

"no"

,

20

)); System.

out

.println(

""no"在strBuffer中在索引20之前最後出現的位置為:"

+ strBuffer.lastIndexOf(

"no"

,

20

)); } } /<code>

執行結果如下圖所示:

Java中字符串StringBuffer和StringBuilder的使用

  • 插入方法

插入方法為:insert(int offset, XXX xxx), 目的是在偏移offset個字符後插入xxx。這裡的xxx表示所有的基本數據類型及其對應的包裝類型、字符數組、字符序列對象和其他的引用對象等。常用方法如下:

Java中字符串StringBuffer和StringBuilder的使用

​相關示例代碼如下所示:

<code>

public

class

StringTest

{

public

static

void

main

(

String[] args

)

{ StringBuilder strBuilder =

new

StringBuilder(

"hello"

); StringBuffer strBuffer =

new

StringBuffer(

"hello"

); System.

out

.println(

"在strBuilder偏移2位後插入整數3的結果為:"

+ strBuilder.insert(

2

,

3

)); System.

out

.println(

"在strBuffer偏移3位後插入整數3的結果為:"

+ strBuffer.insert(

3

,

3

)); StringBuilder strBuilder2 =

new

StringBuilder(

"world"

); StringBuffer strBuffer2 =

new

StringBuffer(

"world"

); System.

out

.println(

"在strBuilder2偏移2位後插入'好'的結果為:"

+ strBuilder2.insert(

2

,

'好'

)); System.

out

.println(

"在strBuffer2偏移3位後插入'好'的結果為:"

+ strBuffer2.insert(

3

,

'好'

)); StringBuilder strBuilder3 =

new

StringBuilder(

"what"

); StringBuffer strBuffer3 =

new

StringBuffer(

"what"

); System.

out

.println(

"在strBuilder3偏移2位後插入4L的結果為:"

+ strBuilder3.insert(

2

,

4L

)); System.

out

.println(

"在strBuffer3偏移3位後插入4L的結果為:"

+ strBuffer3.insert(

3

,

4L

)); StringBuilder strBuilder4 =

new

StringBuilder(

"where"

); StringBuffer strBuffer4 =

new

StringBuffer(

"where"

); System.

out

.println(

"在strBuilder4偏移2位後插入3.14F的結果為:"

+ strBuilder4.insert(

2

,

3.14F

)); System.

out

.println(

"在strBuffer4偏移3位後插入3.14F的結果為:"

+ strBuffer4.insert(

3

,

3.14F

)); StringBuilder strBuilder5 =

new

StringBuilder(

"when"

); StringBuffer strBuffer5 =

new

StringBuffer(

"when"

); System.

out

.println(

"在strBuilder5偏移2位後插入1.414的結果為:"

+ strBuilder5.insert(

2

,

1.414

)); System.

out

.println(

"在strBuffer5偏移3位後插入1.414的結果為:"

+ strBuffer5.insert(

3

,

1.414

)); StringBuilder strBuilder6 =

new

StringBuilder(

"crazy"

); StringBuffer strBuffer6 =

new

StringBuffer(

"crazy"

); System.

out

.println(

"在strBuilder6偏移2位後插入true的結果為:"

+ strBuilder6.insert(

2

,

true

)); System.

out

.println(

"在strBuffer6偏移3位後插入false的結果為:"

+ strBuffer6.insert(

3

,

false

)); StringBuilder strBuilder7 =

new

StringBuilder(

"hehe"

); StringBuffer strBuffer7 =

new

StringBuffer(

"hehe"

); System.

out

.println(

"在strBuilder7偏移2位後插入Date的結果為:"

+ strBuilder7.insert(

2

,

new

Date())); System.

out

.println(

"在strBuffer7偏移3位後插入Date的結果為:"

+ strBuffer7.insert(

3

,

new

Date())); StringBuilder strBuilder8 =

new

StringBuilder(

"this"

); StringBuffer strBuffer8 =

new

StringBuffer(

"this"

); System.

out

.println(

"在strBuilder8偏移2位後插入字符數組['a', 'r', 'e']的結果為:"

+ strBuilder8.insert(

2

,

new

char

[]{

'a'

,

'r'

,

'e'

})); System.

out

.println(

"在strBuffer8偏移3位後插入字符數組['a', 'r', 'e']的結果為:"

+ strBuffer8.insert(

3

,

new

char

[]{

'a'

,

'r'

,

'e'

})); StringBuilder strBuilder9 =

new

StringBuilder(

"happend"

); StringBuffer strBuffer9 =

new

StringBuffer(

"happend"

); System.

out

.println(

"在strBuilder9偏移2位後插入Date的結果為:"

+ strBuilder9.insert(

2

,

new

StringBuffer(

"234"

))); System.

out

.println(

"在strBuffer9偏移3位後插入Date的結果為:"

+ strBuffer9.insert(

3

,

new

StringBuilder(

"234"

))); StringBuilder strBuilder10 =

new

StringBuilder(

"that"

); StringBuffer strBuffer10 =

new

StringBuffer(

"that"

); System.

out

.println(

"在strBuilder10偏移2位後插入字符數組['a', 'r', 'e']的結果為:"

+ strBuilder10.insert(

2

,

new

char

[]{

'a'

,

'r'

,

'e'

},

0

,

2

)); System.

out

.println(

"在strBuffer10偏移3位後插入字符數組['a', 'r', 'e']的結果為:"

+ strBuffer10.insert(

3

,

new

char

[]{

'a'

,

'r'

,

'e'

},

0

,

2

)); StringBuilder strBuilder11 =

new

StringBuilder(

"jerry"

); StringBuffer strBuffer11 =

new

StringBuffer(

"jerry"

); System.

out

.println(

"在strBuilder11偏移2位後插入Date的結果為:"

+ strBuilder11.insert(

2

,

new

StringBuffer(

"234"

),

0

,

2

)); System.

out

.println(

"在strBuffer11偏移3位後插入Date的結果為:"

+ strBuffer11.insert(

3

,

new

StringBuilder(

"234"

),

0

,

2

)); } }/<code>

執行結果如下圖所示:

Java中字符串StringBuffer和StringBuilder的使用

  • 刪除某個或某些字符

刪除某個或某些的字符方法如下圖所示:

Java中字符串StringBuffer和StringBuilder的使用

相關示例代碼如下:

<code>

public

class

StringTest

{

public

static

void

main

(

String[] args

)

{ StringBuilder strBuilder =

new

StringBuilder(

"hello"

); StringBuffer strBuffer =

new

StringBuffer(

"hello"

); System.

out

.println(

"strBuilder刪除索引為1處的字符後結果為:"

+ strBuilder.deleteCharAt(

1

)); System.

out

.println(

"strBuffer刪除索引為1處的字符後結果為:"

+ strBuffer.deleteCharAt(

1

)); StringBuilder strBuilder2 =

new

StringBuilder(

"hello"

); StringBuffer strBuffer2 =

new

StringBuffer(

"hello"

); System.

out

.println(

"strBuilder2刪除索引從1到3(不包括3)的字符後結果為:"

+ strBuilder2.delete(

1

,

3

)); System.

out

.println(

"strBuffer2刪除索引從1到3(不包括3)的字符後結果為:"

+ strBuffer2.delete(

1

,

3

)); } }/<code>

執行結果如下圖所示:

Java中字符串StringBuffer和StringBuilder的使用

  • ​取子字符串

取子字符串的方法如下:

Java中字符串StringBuffer和StringBuilder的使用

示例代碼如下所示:

<code>

public

class

StringTest

{

public

static

void

main

(

String[] args

)

{ StringBuilder strBuilder =

new

StringBuilder(

"hello world"

); StringBuffer strBuffer =

new

StringBuffer(

"hello world"

); System.

out

.println(

"strBuilder從索引3處開始到字符串末尾的子字符串為:"

+ strBuilder.substring(

3

)); System.

out

.println(

"strBuffer從索引3處開始到字符串末尾的子字符串為:"

+ strBuffer.substring(

3

)); StringBuilder strBuilder2 =

new

StringBuilder(

"hello world"

); StringBuffer strBuffer2 =

new

StringBuffer(

"hello world"

); System.

out

.println(

"strBuilder從索引3處開始到5(不包括5)的子字符串為:"

+ strBuilder.substring(

3

,

5

)); System.

out

.println(

"strBuffer從索引3處開始到5(不包括5)的子字符串為:"

+ strBuffer.substring(

3

,

5

)); } }/<code>

執行結果如下圖所示:

Java中字符串StringBuffer和StringBuilder的使用

  • 其他

除了以上列舉的方法外,還有一些常用的方法,分別為:

  1. int capacity():獲取容量(初始化字符數組的長度)
  2. int length():獲取長度(實際字符的長度)
  3. replace(int start, int end, String str):將索引從start到end(不包括end)的字符序列替換為str
  4. char charAt(int index):獲取指定索引出的字符
  5. void setCharAt(int index, char ch):用ch替換指定索引處的字符
  6. void setLength(int newwLength):將字符序列強制變為指定長度,多餘的字符被置為null。
  7. CharSequence subSequence(int start, int end):獲取子字符序列對象。
  8. reverse():將字符序列進行反轉。

示例代碼如下所示:

<code>

public

class

StringTest

{

public

static

void

main

(

String[] args

)

{ StringBuilder strBuilder =

new

StringBuilder(

"hello world"

); StringBuffer strBuffer =

new

StringBuffer(

"hello world"

); System.

out

.println(

"strBuilder的容量為:"

+ strBuilder.capacity()); System.

out

.println(

"strBuffer的容量為:"

+ strBuffer.capacity()); System.

out

.println(

"strBuilder的長度為:"

+ strBuilder.length()); System.

out

.println(

"strBuffer的長度為:"

+ strBuffer.length()); System.

out

.println(

"用"tom"替換strBuilder的0到5(不包括5)後結果為:"

+ strBuilder.replace(

0

,

5

,

"tom"

)); System.

out

.println(

"用"tom"替換strBuffer的0到5(不包括5)後結果為:"

+ strBuffer.replace(

0

,

5

,

"tom"

)); System.

out

.println(

"strBuilder的索引為1的字符為:"

+ strBuilder.charAt(

1

)); System.

out

.println(

"strBuffer的索引為1的字符為:"

+ strBuffer.charAt(

1

)); strBuilder.setLength(

3

); System.

out

.println(

"strBuilder強制變為長度為3的結果為:"

+ strBuilder); strBuffer.setLength(

3

); System.

out

.println(

"strBuffer強制變為長度為3的結果為:"

+ strBuffer); System.

out

.println(

"strBuilder的從0到2的子字符序列為:"

+ strBuilder.subSequence(

0

,

2

)); System.

out

.println(

"strBuffer的從0到2的子字符序列為:"

+ strBuffer.subSequence(

0

,

2

)); System.

out

.println(

"strBuilder的反轉後為:"

+ strBuilder.reverse()); System.

out

.println(

"strBuffer的反轉為:"

+ strBuffer.reverse()); } }/<code>

執行結果如下圖所示:

Java中字符串StringBuffer和StringBuilder的使用

​自此,關於StringBuffer和StringBuilder的介紹就已經算是結束了。


分享到:


相關文章: