在Java中,String类是不可变的,每次使用加号拼接字符串时,都会生成新的String对象,在频繁拼接的场景下会消耗大量内存和CPU资源。StringBuilder是可变的字符序列,专门用于高效拼接字符串,其内部维护了一个字符数组缓冲区,拼接时不会频繁创建新对象,性能优势十分明显。
StringBuilder基础用法
使用StringBuilder拼接字符串的核心是append方法,该方法支持多种类型的参数,包括字符串、整数、布尔值等,会将参数内容追加到当前字符序列的末尾。
public class StringBuilderDemo {
public static void main(String[] args) {
// 创建StringBuilder对象,可指定初始容量
StringBuilder sb = new StringBuilder();
// 使用append方法拼接字符串
sb.append("Hello");
sb.append(" ");
sb.append("World");
// 转换为String输出
String result = sb.toString();
System.out.println(result); // 输出 Hello World
}
}
链式调用简化代码
StringBuilder的append方法会返回当前StringBuilder实例,因此可以使用链式调用的方式简化拼接代码,让代码更简洁。
public class StringBuilderChainDemo {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
// 链式调用append方法
sb.append("Java")
.append(" ")
.append("StringBuilder")
.append(" ")
.append("拼接示例");
System.out.println(sb.toString()); // 输出 Java StringBuilder 拼接示例
}
}
常用方法介绍
除了append方法,StringBuilder还提供了多个实用方法,满足不同的字符串操作需求:
- insert(int offset, 参数):在指定索引位置插入内容,索引从0开始
- delete(int start, int end):删除从start到end-1位置的字符
- reverse():反转当前字符序列
- length():返回当前字符序列的长度
- setLength(int newLength):设置字符序列的长度,超出部分会被截断,不足部分补空字符
以下是这些方法的示例:
public class StringBuilderMethodDemo {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("HelloWorld");
// 插入内容
sb.insert(5, " ");
System.out.println(sb.toString()); // 输出 Hello World
// 删除内容
sb.delete(5, 6);
System.out.println(sb.toString()); // 输出 HelloWorld
// 反转字符串
sb.reverse();
System.out.println(sb.toString()); // 输出 dlroWolleH
// 获取长度
System.out.println("当前长度:" + sb.length()); // 输出 当前长度:10
}
}
性能对比:String拼接 vs StringBuilder拼接
在循环场景中,String拼接和StringBuilder拼接的性能差异十分显著,以下是对比示例:
public class StringBuilderPerformanceDemo {
public static void main(String[] args) {
int loopCount = 100000;
// String拼接测试
long startTime1 = System.currentTimeMillis();
String str = "";
for (int i = 0; i < loopCount; i++) {
str += i;
}
long endTime1 = System.currentTimeMillis();
System.out.println("String拼接耗时:" + (endTime1 - startTime1) + "毫秒");
// StringBuilder拼接测试
long startTime2 = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < loopCount; i++) {
sb.append(i);
}
long endTime2 = System.currentTimeMillis();
System.out.println("StringBuilder拼接耗时:" + (endTime2 - startTime2) + "毫秒");
}
}
运行上述代码可以发现,循环次数越多,StringBuilder的性能优势越明显,String拼接在10万次循环下可能耗时数秒,而StringBuilder通常仅需要几毫秒。
使用注意事项
- StringBuilder是非线程安全的,如果需要在多线程环境下拼接字符串,应该使用StringBuffer,StringBuffer的方法都加了同步锁,线程安全但性能略低于StringBuilder。
- 如果拼接的字符串数量很少,比如只有两三个字符串拼接,使用String的加号拼接和StringBuilder的性能差异可以忽略,此时可以根据代码可读性选择使用方式。
- 如果提前知道要拼接的字符串大致长度,可以在创建StringBuilder时指定初始容量,避免内部数组频繁扩容带来的性能损耗,例如
new StringBuilder(1024)。 - 拼接完成后,及时调用
toString()方法将StringBuilder转换为String,因为StringBuilder没有重写equals和hashCode方法,不适合直接用于需要比较字符串内容的场景。
总结:在Java中,频繁拼接字符串的场景优先使用StringBuilder,通过append方法完成拼接,结合链式调用简化代码,同时注意指定合适的初始容量和非线程安全的特性,就能充分发挥StringBuilder的性能优势。
StringBuilderJava字符串拼接字符串缓冲区append方法修改时间:2026-06-22 23:09:41