Java StringBuffer
外观
Java StringBuffer[编辑 | 编辑源代码]
StringBuffer 是 Java 中用于处理可变字符串的一个关键类,属于 java.lang
包。与不可变的 String
类不同,StringBuffer
允许动态修改字符串内容,适用于频繁进行字符串拼接、插入、删除等操作的场景。它是线程安全的,适合多线程环境使用。
概述[编辑 | 编辑源代码]
StringBuffer
是一个可变的字符序列,内部通过动态数组实现,能够高效地进行字符串操作。它的主要特点包括:
- 可变性:内容可以修改,而不需要创建新对象。
- 线程安全:方法使用
synchronized
关键字修饰,保证多线程环境下的安全性。 - 高性能:适合频繁修改字符串的场景,避免了
String
类因不可变性导致的性能问题。
构造方法[编辑 | 编辑源代码]
StringBuffer
提供了多个构造方法:
StringBuffer()
:创建一个初始容量为 16 的空缓冲区。StringBuffer(int capacity)
:指定初始容量。StringBuffer(String str)
:用指定字符串初始化缓冲区。
示例:
StringBuffer sb1 = new StringBuffer(); // 默认容量 16
StringBuffer sb2 = new StringBuffer(32); // 指定容量 32
StringBuffer sb3 = new StringBuffer("Hello"); // 初始内容 "Hello"
常用方法[编辑 | 编辑源代码]
以下是 StringBuffer
的核心方法:
追加内容(append)[编辑 | 编辑源代码]
append()
方法用于在字符串末尾追加内容,支持多种数据类型:
StringBuffer sb = new StringBuffer("Java");
sb.append(" Programming"); // 追加字符串
sb.append(2023); // 追加数字
System.out.println(sb); // 输出: "Java Programming2023"
插入内容(insert)[编辑 | 编辑源代码]
insert()
在指定位置插入内容:
StringBuffer sb = new StringBuffer("HelloWorld");
sb.insert(5, " "); // 在索引 5 处插入空格
System.out.println(sb); // 输出: "Hello World"
删除内容(delete)[编辑 | 编辑源代码]
delete(int start, int end)
删除指定范围的字符:
StringBuffer sb = new StringBuffer("JavaStringBuffer");
sb.delete(4, 10); // 删除索引 4 到 9
System.out.println(sb); // 输出: "JavaBuffer"
反转字符串(reverse)[编辑 | 编辑源代码]
reverse()
反转字符串内容:
StringBuffer sb = new StringBuffer("ABCDE");
sb.reverse();
System.out.println(sb); // 输出: "EDCBA"
容量管理[编辑 | 编辑源代码]
StringBuffer
内部使用动态数组,当内容超出当前容量时,会自动扩容(通常为原容量的 2 倍 + 2)。可以通过以下方法管理容量:
capacity()
:返回当前容量。ensureCapacity(int minimumCapacity)
:确保最小容量。
示例:
StringBuffer sb = new StringBuffer();
System.out.println(sb.capacity()); // 输出: 16
sb.ensureCapacity(50);
System.out.println(sb.capacity()); // 输出: 50
性能优化[编辑 | 编辑源代码]
在单线程环境下,可以使用非线程安全的 StringBuilder
替代 StringBuffer
以获得更高性能。两者 API 完全兼容。
实际应用案例[编辑 | 编辑源代码]
案例 1:动态 SQL 拼接[编辑 | 编辑源代码]
在数据库操作中,StringBuffer
可用于动态构建 SQL 语句:
StringBuffer sql = new StringBuffer("SELECT * FROM users WHERE 1=1");
if (condition1) sql.append(" AND name = 'Alice'");
if (condition2) sql.append(" AND age > 20");
System.out.println(sql);
案例 2:日志格式化[编辑 | 编辑源代码]
在日志系统中格式化多字段消息:
StringBuffer log = new StringBuffer();
log.append("[INFO] ").append(new Date())
.append(" - User ").append(userId)
.append(" performed action: ").append(action);
System.out.println(log);
与 String 的对比[编辑 | 编辑源代码]
特性 | String | StringBuffer |
---|---|---|
可变性 | 不可变 | 可变 |
线程安全 | 是(因不可变) | 是(同步方法) |
性能 | 适合少量操作 | 适合频繁修改 |
内存效率 | 可能产生较多临时对象 | 更高效 |
内存模型[编辑 | 编辑源代码]
数学计算[编辑 | 编辑源代码]
扩容公式(当需要扩容时):
总结[编辑 | 编辑源代码]
StringBuffer
是处理可变字符串的高效工具,特别适合:
- 需要频繁修改字符串内容的场景
- 多线程环境下的字符串操作
- 避免创建大量临时字符串对象的情况
对于单线程环境,可以考虑使用更轻量级的 StringBuilder
。