温馨提示×

温馨提示×

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

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

java String 为何慢于sb

发布时间:2026-09-15 07:17:19 来源:亿速云 阅读:111 作者:小樊 栏目:编程语言

在 Java 里常说 String 比 StringBuilder(或 StringBuffer)慢,核心原因只有一个:String 是不可变对象(immutable)。

下面从原理上解释为什么“慢”。


1. String 是不可变的

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

在底层发生了什么?

  1. 原有的 "a" 不能被修改
  2. 创建一个新的字符串 "ab"
  3. 把 s 指向新对象
  4. 旧的 "a" 变成垃圾,等待 GC

✅ 每次拼接都会:

  • 新建对象
  • 拷贝字符数组
  • 产生垃圾

2. StringBuilder 是可变的

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

底层是:

  • 一个 char[]
  • 只是在数组里移动指针
  • 不创建新对象(除非扩容)

✅ 拼接越多,差距越大


3. 循环中的对比(最明显)

使用 String(很慢)

String s = "";
for (int i = 0; i < 10000; i++) {
    s += i;
}

每次循环:

  • 新建 String
  • 拷贝之前所有内容
  • 时间复杂度 ≈ O(n²)

使用 StringBuilder(很快)

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
    sb.append(i);
}
  • 只操作一个数组
  • 时间复杂度 ≈ O(n)

4. 内存与 GC 角度

方面 String StringBuilder
对象创建 多 少
内存拷贝 多 少
GC 压力 大 小

5. 什么时候 String 不慢?

✅ 少量拼接 / 编译期已知

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

编译器会优化成:

String s = "abc";

✅ 单次拼接,不是循环


6. 一句话总结

String 慢,是因为拼接就要新建对象;
StringBuilder 快,是因为它在原地修改。

如果你愿意,我也可以:

  • 画内存变化图
  • 对比 StringBuffer vs StringBuilder
  • 结合 JVM 源码讲 char[] 扩容机制
向AI问一下细节

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

AI
助
手