核心机制:为何高效?
- 可变性: 底层维护一个char[] value数组,操作直接修改此数组,避免创建新对象。
- 动态扩容: 当数组容量不足时,自动创建更大数组(通常newCapacity = (oldCapacity * 2) + 2),拷贝原数据。合理设置初始容量(new StringBuilder(100))可优化性能。
- 就地修改: append(), insert(), delete(), replace(), reverse()等方法直接操作内部数组。
关键场景代码示例
// 1. 基础拼接 vs 循环性能对比
long start = System.currentTimeMillis();
String result = "";
for (int i = 0; i < 50000; i++) {
result += i; // 产生大量临时String和StringBuilder对象,性能极差!
}
System.out.println("String拼接耗时: " + (System.currentTimeMillis() - start) + "ms");
start = System.currentTimeMillis();
StringBuilder sb = new StringBuilder(); // 默认容量16
for (int i = 0; i < 50000; i++) {
sb.append(i); // 高效!仅操作内部数组
}
System.out.println("StringBuilder拼接耗时: " + (System.currentTimeMillis() - start) + "ms");
// 2. 链式调用 (常见且高效)
String userInfo = new StringBuilder()
.append("Name: ").append(user.getName())
.append(", Age: ").append(user.getAge())
.append(", Email: ").append(user.getEmail())
.toString(); // 一次性生成最终String
// 3. 其他常用操作
sb.insert(5, "INSERTED"); // 在索引5处插入
sb.delete(10, 15); // 删除索引10-14的字符
sb.replace(0, 4, "REPL"); // 替换索引0-3的字符
sb.reverse(); // 反转内容
System.out.println(sb.toString());
重要注意事项
· 非线程安全: StringBuilder方法未同步,多线程并发修改需用StringBuffer(方法带synchronized关键字,稍慢)。
· toString()开销: 最终调用toString()会复制内部数组生成新String对象。超大StringBuilder需注意此操作内存占用。
· 初始容量: 预估最终字符串长度并设置初始容量(new StringBuilder(estimatedLength)),可显著减少扩容次数,提升性能。
何时使用StringBuilder?
· 循环内拼接字符串
· 动态构建复杂字符串(如SQL、HTML、JSON)
· 需要频繁修改字符串内容
结论: StringBuilder是Java处理可变字符串的利器,理解其可变性、动态扩容机制及适用场景,能有效避免String拼接的性能陷阱,大幅提升程序效率。

被折叠的 条评论
为什么被折叠?



