1?? StringBuffer類
1.1 概念
在Java 中,字符串使用 String
類進(jìn)行表示,但是 String
類所表示的字符串有一個最大的問題:“字符串常量一旦聲明則不可改變,而字符串對象可以改變,但是 改變的是其內(nèi)存地址的指向”。所以String
類不適合于被頻繁修改的字符串操作, 所以在這種情況下,往往可以使用 StringBuffer
或者StringBuilder
類,即 StringBuffer
類或者StringBuilder
類更方便用戶進(jìn)行內(nèi)容的修改。
在 String
類中使用 “+
” 作為數(shù)據(jù)庫的連接操作,而在 StringBuffer
類中使用 append()
方法進(jìn)行數(shù)據(jù)的連接。方法定義:
public StringBuffer append(數(shù)據(jù) 類型變量);
// 范例 1: 觀察StringBuffer 基本使用
package com.xiaoshan.demo;
public class TestDemo {
public static void main(String[] args) throws Exception{
//String類可以直接賦值實例化,但是StringBuffer類不行
StringBuffer buf = new StringBuffer(); //實例化StringBuffer類對象
buf.append("Hello ").append("XIAOSHAN ").append("!");
change(buf); //引用傳遞
System.out.println(buf);
}
public static void change(StringBuffer temp){ // 接收StringBuffer引用
temp.append("\n").append("'https://blog.csdn.net/lvsongtao1225/category_12367710.html");//修改內(nèi)容
}
}
程序執(zhí)行結(jié)果:
Hello XIAOSHAN !
https://blog.csdn.net/lvsongtao1225/category_12367710.html
此程序利用 StringBuffer
類對象實現(xiàn)了引用傳遞,并且通過最終的結(jié)果發(fā)現(xiàn),在 change()
方法中針對 StringBuffer
對象的修改可以影響原始 StringBuffer
類對象,所以 StringBuffer
對象的內(nèi)容是可以修改的。
StringBuffer
類主要用于頻繁修改字符串的操作上。但是在任何開發(fā)中,面對字符串的操作,大部分情況下都先考慮 String
類,只有在需要頻繁修改時才會考慮使用 StringBuffer
或 StringBuilder
類操作。
通過以上兩個類的定義結(jié)構(gòu)可以發(fā)現(xiàn), String
類與 StringBuffer
類都是 CharSequence
接口的子類,也就證明 String
或 StringBuffer
類的對象都可以利用自動向上轉(zhuǎn)型的操作為 CharSequence
接口實例化。
1.2 特征
StringBuffer
類是Java中一個被廣泛使用的可變字符串類。它提供了許多方法來操作和修改字符串內(nèi)容,而不會創(chuàng)建新的對象實例。
以下是StringBuffer
類的一些重要特點:
-
可變性:
StringBuffer
對象是可變的,意味著可以通過調(diào)用相應(yīng)的方法對其內(nèi)容進(jìn)行修改,而不會創(chuàng)建新的對象。相比之下,String
對象是不可變的,一旦創(chuàng)建后就無法更改; -
線程安全:
StringBuffer
類是線程安全的,這意味著它的方法在多線程環(huán)境中可以安全地使用,不會導(dǎo)致競態(tài)條件或數(shù)據(jù)不一致的問題。然而,由于其需要額外的同步開銷,這可能會影響性能。如果不需要線程安全的操作,可以使用非線程安全的兄弟類StringBuilder
,它具有相似的功能但性能更高; -
性能考慮:由于字符串是可變的,可以在執(zhí)行一系列操作后一次性獲取最終結(jié)果,避免了頻繁的字符串拷貝和內(nèi)存分配,因此在某些情況下,
StringBuffer
比使用+
或concat()
操作符連接字符串更高效。
1.3 使用
以下是StringBuffer
類的一些用法:
-
字符串操作:
StringBuffer
類提供了一系列方法來操作字符串,如添加字符、插入字符、替換字符、刪除字符等。這些方法可以根據(jù)需要靈活地修改字符串內(nèi)容; -
連接字符串:
StringBuffer
類也可以用于高效地連接字符串,而不像String
那樣每次連接都創(chuàng)建一個新的字符串對象。append()
方法用于在當(dāng)前字符串末尾添加字符、字符串和其他數(shù)據(jù)類型的值; -
反轉(zhuǎn)字符串:
StringBuffer
類提供了reverse()
方法,用于反轉(zhuǎn)當(dāng)前字符串的順序。這對于需要逆序處理字符串的場景很有用。
下面是一個使用StringBuffer
類的使用示例:
// 范例 2: StringBuffer類的使用
public static void main(String[] args) {
// 創(chuàng)建一個空的StringBuffer對象
StringBuffer sb = new StringBuffer();
// 在末尾添加字符串
sb.append("Hello");
sb.append(" World!");
// 輸出:Hello World!
System.out.println(sb.toString());
// 在指定位置插入字符串
sb.insert(5, "Java ");
System.out.println(sb.toString());
// 反轉(zhuǎn)字符串
sb.reverse();
System.out.println(sb.toString());
}
輸出結(jié)果:
Hello World!
HelloJava World!
!dlroW avaJolleH
總之,StringBuffer
類是處理可變字符串的強(qiáng)大工具,特別適用于需要經(jīng)常修改字符串內(nèi)容的場景。并且它的方法是線程安全的,可以在多線程環(huán)境中安全地使用,不會導(dǎo)致競態(tài)條件或數(shù)據(jù)不一致的問題。但由于其需要額外的同步開銷,也同時會影響一些性能。
2?? StringBuilder類
2.1 概念及特征
StringBuilder
是 Java 中的一個類,它允許可變長度的字符串操作。與 String
類不同,StringBuilder
對象的長度和內(nèi)容都可以修改。這意味著可以在已存在的字符串上進(jìn)行添加、刪除和修改操作,而無需創(chuàng)建新的對象。
以下是該類的一些重要特性:
-
可變性:
StringBuilder
具有可變性,這意味著可以動態(tài)地更改字符串內(nèi)容和長度; -
高效性:相對于直接使用
+
運算符連接字符串的方式,使用StringBuilder
在性能上更高效。當(dāng)需要頻繁進(jìn)行字符串操作時,使用StringBuilder
可以減少系統(tǒng)開銷。
2.2 使用
以下是該類的一些使用方法:
-
初始化:可以通過無參構(gòu)造函數(shù)創(chuàng)建一個空的
StringBuilder
對象,或者可以根據(jù)已存在的字符串創(chuàng)建對象;還可以指定初始容量創(chuàng)建對象。 -
append()
方法:用于在當(dāng)前字符串末尾附加給定的數(shù)據(jù); -
delete()
方法:用于刪除當(dāng)前字符串中指定范圍內(nèi)的字符; -
insert()
方法:用于將給定的數(shù)據(jù)插入到當(dāng)前字符串的指定位置; -
replace()
:該方法用于替換當(dāng)前字符串指定范圍內(nèi)的字符; -
reverse()
:該方法用于逆轉(zhuǎn)當(dāng)前字符串的字符順序; -
toString()
:該方法用于將StringBuilder
對象轉(zhuǎn)換為一個普通的字符串。
下面是一個使用StringBuilder
類的示例:
// 范例 3: StringBuilder類的使用
public static void main(String[] args) {
// 創(chuàng)建一個空的 StringBuilder 對象
StringBuilder sb1 = new StringBuilder();
// 根據(jù)已存在的字符串創(chuàng)建 StringBuilder 對象
StringBuilder sb2 = new StringBuilder("Hello");
// 指定初始容量創(chuàng)建 StringBuilder 對象
StringBuilder sb3 = new StringBuilder(10);
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append("World");
System.out.println(sb.toString());
sb.delete(5, 10);
System.out.println(sb.toString());
sb.insert(5, " World");
System.out.println(sb.toString());
sb.replace(5, 11, " Everybody");
System.out.println(sb.toString());
sb.reverse();
System.out.println(sb.toString());
String str = sb.toString();
System.out.println(str);
}
輸出結(jié)果:
HelloWorld
Hello
Hello World
Hello Everybody
ydobyrevE olleH
ydobyrevE olleH
除了上面提到的常用方法之外,StringBuilder
還有其他一些方法可以查詢和修改字符串。請參考 Java 官方文檔 以獲取更詳盡的信息。
3?? String、StringBuffer和StringBuilder的對比
String
類:適用于少量的字符串不變的操作;StringBuilder
類:適用于單線程下在字符串緩沖區(qū)進(jìn)行大量操作;StringBuffer
類:適用于多線程下在字符串緩沖區(qū)進(jìn)行大量操作。
-
String
類表示不可變的(immutable)字符串,該類是final
修飾的類,不能被繼承且表示字符串常量(字符串常量一旦聲明則不可改變,而字符串對象可以改變,改變的是其內(nèi)存地址的指向),對String
修改會產(chǎn)生新的對象,效率低。而StringBuilder
和StringBuffer
均為可變字符串; -
String
類使用+
和concat()
方法做數(shù)據(jù)的連接操作,而在StringBuffer
類和StringBuilder
類中使用append()
方法進(jìn)行數(shù)據(jù)連接; -
StringBuilder
是非線程安全的,不保證同步所以在性能上較高;StringBuffer
是線程安全的,該類方法都使用了synchronized
修飾,所以符合多線程操作中的安全要求。
?? 本文源碼下載地址
Java的String類講解案例代碼(String類使用:創(chuàng)建對象、比較、連接、截取、查找和替換、拆分…)
《【Java基礎(chǔ)教程】(三十二)常用類庫篇 · 第二講:包裝類 Wrapper Class——概念及用途, 自動裝箱與拆箱,常用操作方法~》
《【Java基礎(chǔ)教程】(三十四)常用類庫篇 · 第四講:Runtime類——API知識匯總分享,深入解析Runtime運行時環(huán)境訪問支持類~》

到了這里,關(guān)于【Java基礎(chǔ)教程】(三十三)常用類庫篇 · 第三講:可變字符串支持類——解析 StringBuffer與 StringBuilder類~的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!