Java 中的 StringBuilder,它是 Java 中用于高效处理可变字符串 的核心类,主要解决了 String 类不可变导致的字符串拼接效率低下问题,下面从核心特性、常用操作、使用示例等方面全面讲解:
一、核心特性
- 可变字符序列 :
StringBuilder的底层是一个可扩容的字符数组(char[]),修改操作(拼接、插入、删除等)直接在原有数组上进行,不会创建新的字符串对象,这是它与String类的核心区别(String是不可变的,修改会产生新对象)。 - 非线程安全 :
StringBuilder没有提供线程同步机制,在多线程环境下并发修改可能会导致数据不一致,效率相对较高。 - 高效性能 :由于避免了频繁创建字符串对象和内存拷贝,在大量字符串拼接、修改场景下,性能远优于
String类和线程安全的StringBuffer(StringBuffer是StringBuilder的线程安全版本,性能略低)。 - 初始容量与扩容机制 :
- 默认初始容量为 16 个字符;
- 也可通过构造方法
new StringBuilder(int capacity)指定初始容量; - 当字符数量超过当前容量时,会自动扩容,扩容规则为
新容量 = 旧容量 * 2 + 2,扩容时会进行数组拷贝,因此指定合适的初始容量可减少扩容次数,进一步提升性能。
二、常用构造方法
| 构造方法 | 说明 |
|---|---|
StringBuilder() |
创建一个空的 StringBuilder,初始容量为 16 |
StringBuilder(int capacity) |
创建一个空的 StringBuilder,指定初始容量 |
StringBuilder(String str) |
创建一个包含指定字符串的 StringBuilder,初始容量为 16 + str.length() |
示例:
// 1. 默认构造
StringBuilder sb1 = new StringBuilder();
// 2. 指定初始容量
StringBuilder sb2 = new StringBuilder(50);
// 3. 基于已有字符串创建
StringBuilder sb3 = new StringBuilder("Hello");
三、核心常用方法
1. 字符串拼接:append(...)
用于将任意类型数据(字符串、基本类型、对象等)拼接到 StringBuilder 的末尾,返回自身对象(支持链式调用)。
StringBuilder sb = new StringBuilder("Java");
// 拼接字符串
sb.append(" ");
sb.append("StringBuilder");
// 链式调用拼接基本类型
sb.append(" - 版本:").append(1.8).append(" - 长度:").append(sb.length());
System.out.println(sb); // 输出:Java StringBuilder - 版本:1.8 - 长度:32
2. 字符串反转:reverse()
将 StringBuilder 中的字符序列反转,返回自身对象(支持链式调用)。
StringBuilder sb = new StringBuilder("Hello World");
sb.reverse();
System.out.println(sb); // 输出:dlroW olleH
3. 插入操作:insert(int offset, ...)
在指定索引位置(offset)插入任意类型数据,索引从 0 开始,返回自身对象(支持链式调用)。
StringBuilder sb = new StringBuilder("Hello World");
// 在索引 5 的位置插入逗号和空格
sb.insert(5, ", ");
System.out.println(sb); // 输出:Hello, World
// 插入多个数据
sb.insert(0, "Java: ").insert(sb.length(), "!");
System.out.println(sb); // 输出:Java: Hello, World!
4. 删除操作:delete(int start, int end)
删除从 start 索引(包含)到 end 索引(不包含)之间的字符序列,返回自身对象(支持链式调用)。
StringBuilder sb = new StringBuilder("Java StringBuilder");
// 删除索引 4 到 10 之间的字符
sb.delete(4, 10);
System.out.println(sb); // 输出:JavaBuilder
5. 替换操作:replace(int start, int end, String str)
将 start 索引(包含)到 end 索引(不包含)之间的字符替换为指定字符串 str,返回自身对象(支持链式调用)。
StringBuilder sb = new StringBuilder("Hello World");
// 将索引 6 到 11 之间的 "World" 替换为 "Java"
sb.replace(6, 11, "Java");
System.out.println(sb); // 输出:Hello Java
6. 转换为 String 类型:toString()
StringBuilder 不能直接作为 String 类型使用,通过 toString() 方法可将其转换为不可变的 String 对象。
StringBuilder sb = new StringBuilder("Hello");
String str = sb.append(" World").toString();
System.out.println(str); // 输出:Hello World
System.out.println(str.getClass()); // 输出:class java.lang.String
7. 获取长度与容量
-
int length():返回当前字符序列的实际长度; -
int capacity():返回当前StringBuilder的容量(底层字符数组的长度)。StringBuilder sb = new StringBuilder("Hello");
System.out.println("实际长度:" + sb.length()); // 输出:5
System.out.println("当前容量:" + sb.capacity()); // 输出:21(16 + 5)
四、完整使用示例
public class StringBuilderDemo {
public static void main(String[] args) {
// 1. 创建 StringBuilder,指定初始容量
StringBuilder sb = new StringBuilder(30);
// 2. 链式调用拼接数据
sb.append("姓名:").append("张三")
.append("\n年龄:").append(25)
.append("\n职业:").append("Java 开发工程师");
// 3. 插入数据
sb.insert(0, "用户信息:\n");
// 4. 替换数据
sb.replace(8, 10, "李四");
// 5. 反转指定部分(反转职业信息)
int start = sb.indexOf("职业:") + 3;
int end = sb.length();
sb.replace(start, end, new StringBuilder(sb.substring(start, end)).reverse().toString());
// 6. 输出原始 StringBuilder
System.out.println("StringBuilder 内容:");
System.out.println(sb);
// 7. 转换为 String 类型
String userInfo = sb.toString();
System.out.println("\n转换为 String 后:");
System.out.println(userInfo);
// 8. 获取长度和容量
System.out.println("\n实际长度:" + sb.length());
System.out.println("当前容量:" + sb.capacity());
}
}
运行结果:
StringBuilder 内容:
用户信息:
姓名:李四
年龄:25
职业:程工发开 avaJ
转换为 String 后:
用户信息:
姓名:李四
年龄:25
职业:程工发开 avaJ
实际长度:46
当前容量:62
五、使用场景与注意事项
1. 适用场景
- 大量字符串拼接(如循环拼接日志、拼接 SQL 语句、动态生成文本内容等);
- 需要频繁修改字符串(插入、删除、替换、反转等操作);
- 单线程环境下(多线程环境建议使用
StringBuffer)。
2. 注意事项
- 避免频繁创建
StringBuilder对象,可复用同一个对象提升性能; - 预估字符串最大长度,指定合适的初始容量,减少扩容带来的性能损耗;
StringBuilder是线程不安全的,多线程并发修改时需手动加锁或使用StringBuffer;- 完成修改后,通过
toString()转换为String类型,便于后续使用(如作为方法参数、存储到集合中等)。
总结
StringBuilder是可变字符序列 ,解决了String不可变导致的修改效率低下问题;- 核心优势是高效 ,但非线程安全,单线程场景优先使用;
- 核心方法:
append()(拼接)、reverse()(反转)、insert()(插入)、delete()(删除)、toString()(转 String); - 使用时建议指定初始容量,减少扩容次数,提升性能
