StringBuilder比普通的“+”符号更高效吗?

4
你能解释一下为什么使用 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];
}

为什么会发生这种情况?

那不是重复的... - Dan Barnet
1
toString() 而不是 ToString() 让我想到这是 Java,而不是 C#。无论如何,请更正您所描述的语言的标签。StringBuilder 是一个类,可能有不同的实现,从而使一些答案可能无效。 - Rob
如果这是一个Java字符串问题,我的理解是使用+运算符进行字符串连接速度更快,因为JDK/JVM会优化最有效的方法,上次我查看时建议在内部使用StringBuilder。建议除非您正在循环连接字符串,否则应使用+。不可否认,这是在JDK 5时期的建议。 - Gavin
1个回答

8

StringBuilder比字符串拼接更高效,因为每次使用字符串拼接时都会创建一个新的不可变字符串,而字符串构建器则创建了一个单个缓冲区以便追加字符。C#文档中这个页面指出String对象是不可变的,而StringBuilder对象是动态的。它还指出:

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

然而,根据这篇文章string.Join()具有最佳的向字符串追加字符算法。

根据Java文档中的此页面String是不可变的,而StringBuilder本质上相同,但可以更改。
似乎使用字符串拼接会导致创建一个新的不可变字符串的开销,而使用字符串构建器只会导致字符被附加到缓冲区中。创建和初始化新对象比将字符附加到缓冲区中更昂贵,所以通常情况下,字符串构建器比字符串拼接更快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接