温馨提示×

温馨提示×

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

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

java String 为何慢于StringBuilder

发布时间:2026-10-05 23:51:26 来源:亿速云 阅读:89 作者:小樊 栏目:编程语言

在 Java 里,String 比 StringBuilder 慢,核心原因是:String 是不可变的(immutable),而 StringBuilder 是可变的(mutable)。下面从原理到例子说明。


1️⃣ String 的不可变性(根本原因)

String 的定义特点

public final class String {
    private final char value[];
}
  • value[] 是 final
  • 一旦创建,内容不能修改
  • 任何“修改”操作(拼接、替换、截取)都会:
    • 创建新的 String 对象
    • 拷贝原字符数组

❌ 所以字符串拼接越多,对象创建和内存拷贝越多


2️⃣ String 拼接为什么慢(典型场景)

示例 1:循环里用 String 拼接

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

背后的真实过程:

s = new StringBuilder(s).append(i).toString();

每一轮:

  • 新建 StringBuilder
  • 拷贝旧字符串
  • 新建 String
  • 产生大量垃圾对象

✅ 时间复杂度:O(n²)
✅ 频繁 GC,性能极差


3️⃣ StringBuilder 为什么快

StringBuilder 的特点

public final class StringBuilder {
    char[] value;
    int count;
}
  • 字符数组可变
  • 拼接时:
    • 直接在数组中追加
    • 不够才扩容(批量扩容)

示例 2:用 StringBuilder

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
    sb.append(i);
}
String s = sb.toString();

✅ 只创建:

  • 1 个 StringBuilder
  • 1 个最终 String

✅ 时间复杂度:O(n)


4️⃣ 对比总结

对比项 String StringBuilder
是否可变 ❌ 不可变 ✅ 可变
拼接方式 新建对象 原地修改
内存分配 多次 一次
GC 压力 高 低
性能 慢 快

5️⃣ 什么时候 String 不慢?

✅ 少量拼接(编译器优化)

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

编译后直接变成:

String s = "abc";

✅ Java 9+ 的优化

  • 使用 byte[] + 编码标识
  • 少量拼接影响很小

6️⃣ 结论一句话

String 慢,是因为“改一次就新建一个对象”;
StringBuilder 快,是因为“在同一个缓冲区里改”。

如果你愿意,我也可以:

  • 用 字节码 / 反编译 证明
  • 讲 StringBuffer vs StringBuilder
  • 分析 真实项目中的性能误区
向AI问一下细节

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

AI
助
手