跳转到内容

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 vs StringBuffer
特性 String StringBuffer
可变性 不可变 可变
线程安全 是(因不可变) 是(同步方法)
性能 适合少量操作 适合频繁修改
内存效率 可能产生较多临时对象 更高效

内存模型[编辑 | 编辑源代码]

graph LR A[StringBuffer Object] --> B[char[] value] A --> C[int count] B --> D['H'] B --> E['e'] B --> F['l'] B --> G['l'] B --> H['o']

数学计算[编辑 | 编辑源代码]

扩容公式(当需要扩容时): newCapacity=(oldCapacity×2)+2

总结[编辑 | 编辑源代码]

StringBuffer 是处理可变字符串的高效工具,特别适合:

  • 需要频繁修改字符串内容的场景
  • 多线程环境下的字符串操作
  • 避免创建大量临时字符串对象的情况

对于单线程环境,可以考虑使用更轻量级的 StringBuilder