StringBuilder如何比普通的更有效" +"?

时间:2015-08-22 16:34:28

标签: java string

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

为什么会这样?

1 个答案:

答案 0 :(得分:6)

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

  

修改StringBuilder时,在达到容量之前,它不会为自身重新分配大小。发生这种情况时,会自动分配新空间并将容量加倍。您可以使用其中一个重载的构造函数指定StringBuilder类的容量。

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

根据Java文档中的this pageString是不可变的,而StringBuilder s基本相同,但可以更改。

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