【问题标题】:How is StringBuilder more efficient than normal "+"? [duplicate]StringBuilder 如何比普通的“+”更高效? [复制]
【发布时间】:2015-08-22 16:34:28
【问题描述】:

你能解释一下为什么使用 StringBuilder 比每次都用“+”添加字符串要快得多吗?例如:

for (int i = 0; i < arr.length; i++) {
    stringBuilder.append(arr[i]);
}
str = stringBuilder.toString();

比:

for (int i = 0; i < arr.length; i++) {
    str = str + arr[i];
}

为什么会这样?

【问题讨论】:

  • 那不是重复的...
  • toString() 而不是 ToString() 让我觉得这是 java,而不是 C#。无论如何,请更正您所描述语言的标签。 StringBuilder 是一个类,可能有不同的实现,导致某些答案可能无效。
  • 如果这是一个 Java 字符串问题,我的理解是字符串连接使用 + 运算符“更快”,因为 JDK/JVM 优化了最有效的方法,我上次查看时建议使用它会在后台使用 StringBuilder。有人建议,除非您在循环中连接,否则您应该使用 +。诚然,这又回到了 JDK 5 中。

标签: java string


【解决方案1】:

StringBuilder 比字符串连接更有效,因为每次使用字符串连接都会创建一个新的不可变字符串,而字符串构建器会创建一个 single buffer 用于附加字符。 C# 文档中的This page 声明 String 对象是不可变的,而 StringBuilder 对象是动态的。它还指出

当您修改 StringBuilder 时,它不会为自己重新分配大小,直到达到容量为止。发生这种情况时,新空间会自动分配,容量会增加一倍。您可以使用重载的构造函数之一指定 StringBuilder 类的容量。

但是,根据this articlestring.Join() 具有将字符附加到字符串的最佳算法。

根据 Java 文档中的this pageStrings 是不可变的,而StringBuilders 本质上是相同的,但可以更改。

似乎使用字符串连接会导致创建新的不可变字符串的开销,而使用字符串构建器只会导致字符被附加到缓冲区。创建和初始化新对象比将字符附加到缓冲区更昂贵,这就是为什么字符串生成器通常比字符串连接更快的原因。

【讨论】:

    猜你喜欢
    • 2021-04-19
    • 2018-06-02
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多