# 怎么使用Java中的StringBuffer完成替換字符
## 目錄
1. [StringBuffer概述](#stringbuffer概述)
2. [StringBuffer核心方法解析](#stringbuffer核心方法解析)
3. [替換字符的5種實現方式](#替換字符的5種實現方式)
4. [性能對比與最佳實踐](#性能對比與最佳實踐)
5. [實際應用場景](#實際應用場景)
6. [常見問題解答](#常見問題解答)
---
## StringBuffer概述
### 基本特性
StringBuffer是Java中用于處理可變字符串的關鍵類,與String類最大的區別在于其**內容可變性**和**線程安全性**。當需要進行頻繁的字符串修改操作時,使用StringBuffer能顯著提升性能(相比String的不可變特性)。
```java
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 直接修改原對象
特性 | StringBuffer | StringBuilder |
---|---|---|
線程安全 | 是(同步方法) | 否 |
性能 | 較低 | 較高 |
適用場景 | 多線程環境 | 單線程環境 |
// 方式1:默認容量(16)
StringBuffer sb1 = new StringBuffer();
// 方式2:指定初始容量
StringBuffer sb2 = new StringBuffer(100);
// 方式3:基于字符串初始化
StringBuffer sb3 = new StringBuffer("Initial");
append() - 追加內容
sb.append("123").append(true);
insert() - 在指定位置插入
sb.insert(2, "INSERT");
delete() - 刪除子串
sb.delete(1, 3); // 刪除[1,3)區間
reverse() - 反轉字符串
sb.reverse();
StringBuffer sb = new StringBuffer("ABCDE");
sb.setCharAt(2, 'X'); // 結果:ABXDE
sb.replace(1, 4, "1234");
// 原內容:ABXDE → 結果:A1234E
sb.delete(1, 3).insert(1, "NEW");
String result = sb.toString().replaceAll("\\d", "*");
sb = new StringBuffer(result);
for(int i=0; i<sb.length(); i++){
if(sb.charAt(i) == 'A'){
sb.setCharAt(i, 'Z');
}
}
方法 | 100次操作 | 10,000次操作 |
---|---|---|
setCharAt() | 120 | 8,200 |
replace() | 350 | 25,000 |
delete()+insert() | 420 | 30,500 |
正則表達式 | 2,100 | 180,000 |
setCharAt()
replace()
// 預先分配足夠容量
StringBuffer sb = new StringBuffer(1024);
// 清空緩沖區復用對象
sb.setLength(0);
public static String maskSensitiveInfo(String input) {
StringBuffer sb = new StringBuffer(input);
for(int i=3; i<sb.length()-4; i++){
sb.setCharAt(i, '*');
}
return sb.toString();
}
// 輸入:"信用卡號:6225888812345678"
// 輸出:"信用卡號:622**********5678"
String template = "尊敬的{name},您的訂單{orderId}已發貨";
StringBuffer sb = new StringBuffer(template);
int nameIndex = sb.indexOf("{name}");
sb.replace(nameIndex, nameIndex+6, "張三");
int orderIndex = sb.indexOf("{orderId}");
sb.replace(orderIndex, orderIndex+9, "NO20230815");
StringBuffer sql = new StringBuffer("SELECT * FROM users WHERE 1=1");
if(StringUtils.isNotBlank(name)){
sql.append(" AND name LIKE '%").append(name).append("%'");
}
if(minAge != null){
sql.append(" AND age >= ").append(minAge);
}
雖然StringBuffer的方法都是synchronized
修飾的,但復合操作仍需要額外同步:
// 線程不安全的復合操作
if(sb.length() > 0){
sb.deleteCharAt(0); // 可能被其他線程打斷
}
// 正確做法
synchronized(sb){
if(sb.length() > 0){
sb.deleteCharAt(0);
}
}
// 安全的替換寫法
int index = sb.indexOf("old");
if(index != -1){
sb.replace(index, index+"old".length(), "new");
}
當處理超過1MB的字符串時:
1. 使用ensureCapacity()
預分配內存
2. 考慮分塊處理
3. 對于純ASCII內容,可改用char[]
數組操作
// 低效做法(每次創建新對象)
sb = new StringBuffer(str);
// 高效做法(復用對象)
sb.setLength(0);
sb.append(str);
StringBuffer提供了豐富的字符替換方法,開發者應根據具體場景選擇最合適的操作方式。關鍵點總結:
1. 簡單字符替換 → setCharAt()
2. 區間替換 → replace()
3. 復雜模式替換 → 轉為String處理
4. 多線程環境 → 注意復合操作的同步
5. 性能敏感場景 → 預分配容量、避免頻繁轉換
“`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。