温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java String 为何慢于 StringBuilder

发布时间:2026-10-26 13:50:06 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

在 Java 中,String 比 StringBuilder 慢,核心原因是:String 是不可变对象(immutable),而 StringBuilder 是可变对象(mutable)。下面从原理、示例和场景三个层面说明。


一、根本原因:String 不可变

1. String 的不可变性

String s = "a";
s = s + "b";

实际发生了什么?

  1. 创建一个新 String 对象 "a"
  2. 再创建一个新 String 对象 "ab"
  3. 旧对象 "a" 成为垃圾

✅ 每次拼接都会生成新的 String 对象


2. StringBuilder 的可变性

StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b");

实际发生了什么?

  • 始终操作同一个字符数组(char[])
  • 只在必要时扩容

✅ 不会频繁创建对象


二、性能差异的本质

1. 对象创建成本

操作 String StringBuilder
拼接 10 次 创建 10+ 个对象 1 个对象
内存分配 频繁 少
GC 压力 高 低

2. 字符串拼接的编译优化(注意例外)

✅ 编译期常量拼接(快)

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)


四、为什么 Java 要把 String 设计成不可变?

虽然慢,但不可变带来重大好处:

  • 线程安全
  • 可缓存(常量池)
  • Hash 稳定(适合做 Map 的 key)
  • 安全性(网络、IO、反射)

所以:

String 为“安全与稳定”牺牲性能


五、什么时候用哪个?

✅ 用 String

  • 固定字符串
  • 少量拼接
  • 作为 Map key

✅ 用 StringBuilder

  • 循环拼接
  • SQL / JSON 构建
  • 大量字符串操作

❌ 错误用法

String s = "";
for (...) {
    s += x;  // 慢
}

六、一句话总结

String 慢,是因为它“不变”,每次修改都要新建对象;
StringBuilder 快,是因为它“可变”,直接在原对象上修改。

如果你愿意,我也可以给你:

  • JVM 层面内存图
  • StringBuilder vs StringBuffer
  • 字节码级对比
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手