在 Java 中,String 比 StringBuilder 慢,核心原因是:String 是不可变对象(immutable),而 StringBuilder 是可变对象(mutable)。下面从原理、示例和场景三个层面说明。
String 不可变String 的不可变性String s = "a";
s = s + "b";
实际发生了什么?
String 对象 "a"String 对象 "ab""a" 成为垃圾✅ 每次拼接都会生成新的 String 对象
StringBuilder 的可变性StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b");
实际发生了什么?
✅ 不会频繁创建对象
| 操作 | String | StringBuilder |
|---|---|---|
| 拼接 10 次 | 创建 10+ 个对象 | 1 个对象 |
| 内存分配 | 频繁 | 少 |
| GC 压力 | 高 | 低 |
String s = "a" + "b" + "c";
编译器直接优化为:
String s = "abc";
String s = "";
for (int i = 0; i < 10000; i++) {
s += i;
}
等价于:
s = new StringBuilder(s).append(i).toString();
每次循环都新建 StringBuilder + String
// String(慢)
String s = "";
for (int i = 0; i < n; i++) {
s += i;
}
时间复杂度:O(n²)(不断复制字符)
// StringBuilder(快)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
sb.append(i);
}
时间复杂度:O(n)
String 设计成不可变?虽然慢,但不可变带来重大好处:
所以:
String 为“安全与稳定”牺牲性能
StringStringBuilderString s = "";
for (...) {
s += x; // 慢
}
String慢,是因为它“不变”,每次修改都要新建对象;
StringBuilder快,是因为它“可变”,直接在原对象上修改。
如果你愿意,我也可以给你:
StringBuilder vs StringBuffer免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。