在 Java 里,String 比 StringBuilder 慢,核心原因是:String 是不可变的(immutable),而 StringBuilder 是可变的(mutable)。下面从原理到例子说明。
public final class String {
private final char value[];
}
value[] 是 final❌ 所以字符串拼接越多,对象创建和内存拷贝越多
String s = "";
for (int i = 0; i < 10000; i++) {
s += i;
}
背后的真实过程:
s = new StringBuilder(s).append(i).toString();
每一轮:
✅ 时间复杂度:O(n²)
✅ 频繁 GC,性能极差
public final class StringBuilder {
char[] value;
int count;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
String s = sb.toString();
✅ 只创建:
✅ 时间复杂度:O(n)
| 对比项 | String | StringBuilder |
|---|---|---|
| 是否可变 | ❌ 不可变 | ✅ 可变 |
| 拼接方式 | 新建对象 | 原地修改 |
| 内存分配 | 多次 | 一次 |
| GC 压力 | 高 | 低 |
| 性能 | 慢 | 快 |
String s = "a" + "b" + "c";
编译后直接变成:
String s = "abc";
byte[] + 编码标识String 慢,是因为“改一次就新建一个对象”;
StringBuilder 快,是因为“在同一个缓冲区里改”。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。