理解 StringBuffer 的可变性与线程安全特性
掌握 StringBuffer 的核心方法(append、insert、replace、delete、reverse 等)
能够根据场景选择 String、StringBuffer 或 StringBuilder
了解容量管理机制及其对性能的影响
StringBuffer 是 Java 中用于表示可变字符序列的类。与不可变的 String 不同,StringBuffer 允许在不创建新对象的情况下直接修改内容。
关键特性:
可变:内容可被修改
线程安全:所有方法均为
synchronized高效拼接:适合频繁字符串操作的场景
public class CoderHub {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
sb.append("Hello");
sb.append(" ");
sb.append("world");
String result = sb.toString();
System.out.println(result); // Hello world
}
}💡 注意:最终通常调用
toString()转为不可变String使用。
// 1. 默认构造(容量16)
StringBuffer sb1 = new StringBuffer();
sb1.append("Hello");
// 2. 指定容量(避免频繁扩容)
StringBuffer sb2 = new StringBuffer(50);
sb2.append("Java Programming");
// 3. 从字符串初始化
StringBuffer sb3 = new StringBuffer("Welcome");
sb3.append(" to Java");
System.out.println(sb1); // Hello
System.out.println(sb2); // Java Programming
System.out.println(sb3); // Welcome to Javaappend(String str)在末尾追加内容。
StringBuffer sb = new StringBuffer("Hello ");
sb.append("Java");
System.out.println(sb); // Hello Java支持多种类型:
char、int、boolean、Object等。
insert(int offset, String str)在指定位置插入内容。
StringBuffer sb = new StringBuffer("Hello ");
sb.insert(1, "Java"); // 在索引1处插入
System.out.println(sb); // HJavaello 索引越界会抛出
StringIndexOutOfBoundsException。
replace(int start, int end, String str)替换 [start, end) 区间的字符。
StringBuffer sb = new StringBuffer("Hello");
sb.replace(1, 3, "Java"); // 替换索引1~2("el" → "Java")
System.out.println(sb); // HJavalodelete(int start, int end)删除 [start, end) 区间的字符。
StringBuffer sb = new StringBuffer("Hello");
sb.delete(1, 3); // 删除 "el"
System.out.println(sb); // Hlo还有
deleteCharAt(int index)删除单个字符。
reverse()反转整个字符序列。
StringBuffer sb = new StringBuffer("Hello");
sb.reverse();
System.out.println(sb); // olleH常用于回文判断、字符串翻转等算法题。
capacity() 与扩容机制初始容量:16
扩容公式:新容量 = (旧容量 × 2) + 2
StringBuffer sb = new StringBuffer();
System.out.println(sb.capacity()); // 16
sb.append("Hello"); // 长度5 < 16,容量不变
System.out.println(sb.capacity()); // 16
sb.append(" java is my favourite language"); // 总长 > 16
System.out.println(sb.capacity()); // 34 = (16*2)+2优化建议:若预知数据量较大,使用
new StringBuffer(estimatedSize)避免多次扩容。
length()返回当前字符数量(非容量)。
StringBuffer sb = new StringBuffer("GeeksforGeeks");
System.out.println("Length = " + sb.length()); // 13
length()≤capacity()
选择指南:
单线程 + 高频修改 →
StringBuilder多线程 + 高频修改 →
StringBuffer内容固定 →
String
StringBuffer 是线程安全的可变字符序列
所有修改操作(append、insert 等)直接改变原对象
默认容量 16,超限时按 (old×2)+2 扩容
性能低于 StringBuilder,仅在多线程场景推荐使用
最终通过 toString() 转为标准 String 对象
💡 最佳实践:在已知字符串操作次数和大致长度时,预先设置容量可显著减少内存拷贝,提升性能。
为什么 StringBuffer 的扩容公式是 (oldCapacity * 2) + 2?这种设计相比简单翻倍(*2)有什么优势?
在单线程环境中使用 StringBuffer 会导致什么性能问题?如何通过代码验证其比 StringBuilder 慢?
编写一个方法,使用 StringBuffer 实现“将句子中每个单词首字母大写”的功能(如 "hello world" → "Hello World")。