StringBuffer
是 Java 中用于处理字符串的一个类,它属于 java.lang
包。与 String
类不同,StringBuffer
是可变的(mutable),这意味着它的内容可以被修改,而不会创建新的对象。StringBuffer
主要用于需要频繁修改字符串的场景,因为它比 String
更高效。
以下是关于 StringBuffer
的详细讲解:
1. StringBuffer
的特点
-
可变性:
StringBuffer
的内容可以被修改,而不会创建新的对象。 -
线程安全:
StringBuffer
的方法是同步的(synchronized),因此它是线程安全的,适合多线程环境。 -
性能:由于
StringBuffer
是可变的,它在频繁修改字符串时比String
更高效。
2. StringBuffer
的常用方法
(1) 构造方法
-
StringBuffer()
:创建一个空的StringBuffer
,初始容量为 16 个字符。java
复制
StringBuffer sb = new StringBuffer();
-
StringBuffer(int capacity)
:创建一个指定容量的StringBuffer
。java
复制
StringBuffer sb = new StringBuffer(100);
-
StringBuffer(String str)
:创建一个包含指定字符串内容的StringBuffer
。java
复制
StringBuffer sb = new StringBuffer("Hello");
(2) 追加内容
-
append()
:在StringBuffer
的末尾追加内容。支持多种数据类型(如String
、int
、char
等)。java
复制
sb.append(" World"); sb.append(123); sb.append(true);
(3) 插入内容
-
insert(int offset, String str)
:在指定位置插入内容。java
复制
sb.insert(5, " Beautiful");
(4) 删除内容
-
delete(int start, int end)
:删除从start
到end-1
之间的字符。java
复制
sb.delete(5, 10);
-
deleteCharAt(int index)
:删除指定位置的字符。java
复制
sb.deleteCharAt(0);
(5) 替换内容
-
replace(int start, int end, String str)
:用str
替换从start
到end-1
之间的字符。java
复制
sb.replace(0, 5, "Hi");
(6) 反转内容
-
reverse()
:反转StringBuffer
中的字符。java
复制
sb.reverse();
(7) 获取长度和容量
-
length()
:返回StringBuffer
中字符的数量。java
复制
int len = sb.length();
-
capacity()
:返回StringBuffer
的当前容量。java
复制
int cap = sb.capacity();
(8) 设置长度
-
setLength(int newLength)
:设置StringBuffer
的长度。如果新长度小于当前长度,多余的部分会被截断;如果大于当前长度,会用空字符填充。java
复制
sb.setLength(10);
(9) 转换为字符串
-
toString()
:将StringBuffer
转换为String
。java
复制
String result = sb.toString();
3. StringBuffer
的使用示例
示例 1:基本操作
java
复制
StringBuffer sb = new StringBuffer("Hello"); sb.append(" World"); sb.insert(5, " Beautiful"); sb.replace(0, 5, "Hi"); sb.delete(10, 15); System.out.println(sb.toString()); // 输出: Hi Beautiful
示例 2:反转字符串
java
复制
StringBuffer sb = new StringBuffer("Hello"); sb.reverse(); System.out.println(sb.toString()); // 输出: olleH
示例 3:线程安全
java
复制
StringBuffer sb = new StringBuffer(); Runnable task = () -> { for (int i = 0; i < 1000; i++) { sb.append("a"); } }; Thread t1 = new Thread(task); Thread t2 = new Thread(task); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(sb.length()); // 输出: 2000
4. StringBuffer
与 StringBuilder
的区别
-
线程安全性:
-
StringBuffer
是线程安全的,所有方法都是同步的。 -
StringBuilder
是非线程安全的,性能更高。
-
-
性能:
-
在单线程环境下,
StringBuilder
比StringBuffer
更快,因为它没有同步开销。
-
-
使用场景:
-
如果需要线程安全,使用
StringBuffer
。 -
如果不需要线程安全,使用
StringBuilder
。
-
5. StringBuffer
的性能优化
-
初始容量:如果知道字符串的大致长度,可以在创建
StringBuffer
时指定初始容量,避免频繁扩容。java
复制
StringBuffer sb = new StringBuffer(100);
-
避免频繁扩容:
StringBuffer
在容量不足时会自动扩容(通常是当前容量的 2 倍 + 2),频繁扩容会影响性能。
6. 总结
-
StringBuffer
是一个可变的字符串类,适合需要频繁修改字符串的场景。 -
它是线程安全的,适合多线程环境。
-
常用方法包括
append()
、insert()
、delete()
、replace()
和reverse()
。 -
在单线程环境下,
StringBuilder
是更好的选择,因为它性能更高。 -
通过合理设置初始容量,可以优化
StringBuffer
的性能。