在 Java 中,StringBuilder 比 String 高效,核心原因在于 String 的不可变性(immutability) 以及由此带来的频繁对象创建和内存开销。
下面从原理到对比详细说明。
String s = "a";
s = s + "b";
实际上发生了:
"a""ab""a" 变成垃圾对象✅ 每次拼接都会生成新的 String 对象
String result = "";
for (int i = 0; i < 10000; i++) {
result += i;
}
等价于:
result = new StringBuilder(result).append(i).toString();
问题:
StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b");
char[] 数组char[] value;
int count;
| 操作 | String | StringBuilder |
|---|---|---|
| 单次拼接 | O(n) | O(1) |
| n 次拼接 | O(n²) | O(n) |
String s = "";
for (int i = 0; i < 10000; i++) {
s += i;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
String s = sb.toString();
✅ 后者速度通常 快几十倍甚至上百倍
不是:
String 更简洁,性能差异可忽略String s = "a" + "b" + "c"; // 编译后直接是 "abc"
| 类 | 线程安全 | 性能 |
|---|---|---|
| StringBuffer | ✅ 同步 | 稍慢 |
| StringBuilder | ❌ 非同步 | 更快 |
✅ 单线程优先用 StringBuilder
String 每次修改都创建新对象,StringBuilder 在同一对象上修改,因此更少对象、更少 GC、性能更高。
如果你愿意,我也可以从 JVM 内存模型 / 字节码层面 再深入讲一讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。