在大量字符串拼接操作時(shí)請(qǐng)使用StringBuffer解讀
StringBuffer的產(chǎn)生背景
StringBuffer是Java早期版本中引入的一個(gè)類(lèi),它的產(chǎn)生背景主要有以下幾個(gè)原因:
1. 解決String不可變性問(wèn)題
- Java中的String對(duì)象是不可變的(immutable),每次修改String實(shí)際上都是創(chuàng)建新的String對(duì)象
- 頻繁修改字符串時(shí)會(huì)產(chǎn)生大量臨時(shí)對(duì)象,影響性能
- StringBuffer提供了可變的字符串緩沖區(qū),可以在原對(duì)象上修改而不創(chuàng)建新對(duì)象
2. 線程安全需求
- StringBuffer的方法都是同步的(synchronized),適合多線程環(huán)境下的字符串操作
- 早期Java版本中,多線程編程較為常見(jiàn),需要線程安全的字符串操作類(lèi)
3. 性能優(yōu)化
- 在大量字符串拼接操作時(shí),使用StringBuffer比直接使用"+"操作符更高效
- StringBuffer內(nèi)部維護(hù)了一個(gè)可擴(kuò)展的字符數(shù)組,減少了內(nèi)存分配和垃圾回收的開(kāi)銷(xiāo)
4. 歷史原因
- StringBuffer在Java 1.0中就已經(jīng)存在
- 后來(lái)(Java 5)又引入了非線程安全的StringBuilder,作為單線程環(huán)境下的替代方案
StringBuffer的設(shè)計(jì)反映了早期Java對(duì)線程安全的重視,但隨著單線程應(yīng)用場(chǎng)景的增加,StringBuilder因其更高的性能而成為更常用的選擇。不過(guò)StringBuffer在多線程環(huán)境下仍然有其價(jià)值。
StringBuffer 詳解
1. StringBuffer 概述
StringBuffer 是 Java 中用于可變字符串操作的類(lèi),位于 java.lang 包中。
它提供了比 String 更高效的字符串修改方式,適用于頻繁修改字符串的場(chǎng)景,并且是線程安全的(方法使用 synchronized 修飾)。
主要特點(diǎn):
- 可變性:可以直接修改字符串內(nèi)容,而不像
String每次修改都生成新對(duì)象。 - 線程安全:方法使用
synchronized修飾,適合多線程環(huán)境。 - 高效拼接:內(nèi)部維護(hù)一個(gè)動(dòng)態(tài)擴(kuò)容的字符數(shù)組,減少內(nèi)存分配和垃圾回收開(kāi)銷(xiāo)。
2. StringBuffer 的構(gòu)造方法
| 構(gòu)造方法 | 說(shuō)明 |
|---|---|
| StringBuffer() | 構(gòu)造一個(gè)初始容量為 16 的空緩沖區(qū) |
| StringBuffer(int capacity) | 構(gòu)造指定初始容量的空緩沖區(qū) |
| StringBuffer(String str) | 構(gòu)造一個(gè)初始內(nèi)容為 str 的緩沖區(qū),容量為 str.length() + 16 |
示例:
StringBuffer sb1 = new StringBuffer(); // 初始容量 16
StringBuffer sb2 = new StringBuffer(32); // 初始容量 32
StringBuffer sb3 = new StringBuffer("Hello"); // 初始內(nèi)容 "Hello",容量 21 (5 + 16)3. StringBuffer 的常用方法
(1) 增:append()和insert()
| 方法 | 說(shuō)明 |
|---|---|
| append(xxx) | 在末尾追加數(shù)據(jù)(支持多種類(lèi)型:int、char、String 等) |
| insert(int offset, xxx) | 在指定位置插入數(shù)據(jù) |
示例:
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // "Hello World"
sb.insert(5, ","); // "Hello, World"(2) 刪:delete()和deleteCharAt()
| 方法 | 說(shuō)明 |
|---|---|
| delete(int start, int end) | 刪除 [start, end) 之間的字符 |
| deleteCharAt(int index) | 刪除指定位置的字符 |
示例:
StringBuffer sb = new StringBuffer("Hello, World");
sb.delete(5, 7); // "Hello World"(刪除 ", ")
sb.deleteCharAt(5); // "HelloWorld"(刪除空格)(3) 改:replace()和setCharAt()
| 方法 | 說(shuō)明 |
|---|---|
| replace(int start, int end, String str) | 替換 [start, end) 之間的內(nèi)容為 str |
| setCharAt(int index, char ch) | 替換指定位置的字符 |
示例:
StringBuffer sb = new StringBuffer("Hello World");
sb.replace(6, 11, "Java"); // "Hello Java"
sb.setCharAt(0, 'h'); // "hello Java"(4) 查:charAt()、indexOf()、substring()
| 方法 | 說(shuō)明 |
|---|---|
| charAt(int index) | 返回指定位置的字符 |
| indexOf(String str) | 返回 str 第一次出現(xiàn)的索引 |
| substring(int start, int end) | 返回 [start, end) 的子字符串 |
示例:
StringBuffer sb = new StringBuffer("Hello Java");
char ch = sb.charAt(6); // 'J'
int index = sb.indexOf("Java"); // 6
String sub = sb.substring(6, 10); // "Java"(5) 其他方法
| 方法 | 說(shuō)明 |
|---|---|
| length() | 返回字符串長(zhǎng)度 |
| capacity() | 返回當(dāng)前緩沖區(qū)容量 |
| reverse() | 反轉(zhuǎn)字符串 |
| toString() | 轉(zhuǎn)換為 String |
示例:
StringBuffer sb = new StringBuffer("Hello");
System.out.println(sb.length()); // 5
System.out.println(sb.capacity()); // 21 (5 + 16)
sb.reverse(); // "olleH"
String str = sb.toString(); // 轉(zhuǎn)換為 String4. StringBuffer 的擴(kuò)容機(jī)制
默認(rèn)初始容量:16(如果未指定)。
擴(kuò)容規(guī)則:
- 當(dāng)字符串長(zhǎng)度超過(guò)當(dāng)前容量時(shí),自動(dòng)擴(kuò)容。
- 新容量 = (舊容量 * 2) + 2。
- 如果仍然不夠,則直接擴(kuò)容到所需的最小容量。
示例:
StringBuffer sb = new StringBuffer(); // 初始容量 16
sb.append("1234567890123456"); // 剛好 16 字符,不擴(kuò)容
sb.append("X"); // 超過(guò)容量,擴(kuò)容至 (16*2)+2 = 34
System.out.println(sb.capacity()); // 345. StringBuffer vs StringBuilder
| 對(duì)比項(xiàng) | StringBuffer | StringBuilder |
|---|---|---|
| 線程安全 | ? 線程安全(synchronized) | ? 非線程安全 |
| 性能 | 稍慢(同步開(kāi)銷(xiāo)) | 更快 |
| 適用場(chǎng)景 | 多線程環(huán)境 | 單線程環(huán)境 |
推薦使用:
- 單線程:優(yōu)先用
StringBuilder(更快)。 - 多線程:用
StringBuffer(線程安全)。
總結(jié)
StringBuffer 適用于頻繁修改字符串,比 String 更高效。
- 線程安全,但性能略低于
StringBuilder。 - 擴(kuò)容機(jī)制:默認(rèn) 16,不夠時(shí)
(oldCapacity * 2) + 2。 - 主要方法:
append()、insert()、delete()、replace()、reverse()等。
適用場(chǎng)景:
- 多線程環(huán)境下的字符串拼接、修改。
- 需要頻繁修改字符串內(nèi)容時(shí)(如日志處理、動(dòng)態(tài) SQL 拼接)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot實(shí)現(xiàn)嵌入式 Servlet容器
傳統(tǒng)的Spring MVC工程部署時(shí)需要將WAR文件放置在servlet容器的文檔目錄內(nèi),而Spring Boot工程使用嵌入式servlet容器省去了這一步驟,本文就來(lái)設(shè)置一下相關(guān)配置,感興趣的可以了解一下2023-12-12
Spring?Cloud中Sentinel的兩種限流模式介紹
SpringBoot整合JWT實(shí)現(xiàn)登錄認(rèn)證與接口授權(quán)的全流程
Java MyBatis返回兩個(gè)字段作為Map的key和value問(wèn)題
springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀
淺談Spring與SpringMVC父子容器的關(guān)系與初始化

