Java StringBuffer
StringBuffer 与 String 的区别、可变字符串操作与常用方法。
Key PointsString 不可变、StringBuffer 可变且线程安全、StringBuilder 可变但非线程安全(更快)。单线程优先 StringBuilder。
StringBuffer 与 String 的区别
String allocates on every concatenation; StringBuffer keeps a mutable character array and appends in place, avoiding intermediate objects — ideal for building strings in loops.
Java
public class SBDemo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
sb.append('!');
System.out.println(sb);
System.out.println(sb.length());
System.out.println(sb.reverse());
StringBuilder sb2 = new StringBuilder("abc");
System.out.println(sb2.append(123));
}
}Output
Hello World!
12
!dlroW olleH
abc123StringBuffer 方法
Common methods: append, insert at an index, delete / deleteCharAt, replace a range, reverse, and toString. Each returns the buffer itself, so calls chain.
Java
public class SBMethods {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abcdef");
sb.insert(0, ">>");
System.out.println(sb);
sb.delete(0, 2);
System.out.println(sb);
sb.replace(0, 3, "XYZ");
System.out.println(sb);
System.out.println(sb.charAt(0));
System.out.println(sb.indexOf("Z"));
}
}Output
>>abcdef
abcdef
XYZdef
X
2StringBuffer methods are synchronized, making it slower than StringBuilder in single-threaded code. Use StringBuilder unless the buffer really is shared across threads.StringBuffer 与 String 的区别
String 每次拼接都新建对象;StringBuffer 内部维护一个可变字符数组,append 就地追加,不产生中间对象,适合循环里累积字符串。
Java
public class SBDemo {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World");
sb.append('!');
System.out.println(sb);
System.out.println(sb.length());
System.out.println(sb.reverse());
StringBuilder sb2 = new StringBuilder("abc");
System.out.println(sb2.append(123));
}
}Output
Hello World!
12
!dlroW olleH
abc123StringBuffer 方法
常用方法:append 追加、insert 指定位置插入、delete / deleteCharAt 删除、replace 替换区间、reverse 反转、toString 转回 String。这些方法都返回自身,可以链式调用。
Java
public class SBMethods {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("abcdef");
sb.insert(0, ">>");
System.out.println(sb);
sb.delete(0, 2);
System.out.println(sb);
sb.replace(0, 3, "XYZ");
System.out.println(sb);
System.out.println(sb.charAt(0));
System.out.println(sb.indexOf("Z"));
}
}Output
>>abcdef
abcdef
XYZdef
X
2StringBuffer 的方法都加了 synchronized,单线程下比 StringBuilder 慢。除非确实跨线程共享,否则用 StringBuilder。