40

可能重复:
Java 中 toString() 中的 StringBuilder 与字符串连接

我想知道,由于编译器在执行字符串连接时在内部使用 StringBuilder 来附加字符串,那么如果字符串连接已经为您完成了这项工作,那么有什么意义,为什么我还要使用 StringBuilder 呢?还有其他具体原因吗?

4

2 回答 2

69

正如您所提到的,您不应该使用StringBuilder简单的字符串连接表达式来代替,例如a + " = " + b. 后者打字速度更快,更容易阅读,而且编译器StringBuilder无论如何都会在内部使用 a ,因此重写它并没有性能优势。

但是StringBuilder,如果您在循环中连接大量字符串,则很有用。以下代码效率低下。它需要 O(n 2 ) 时间来运行并创建许多临时字符串。

String result = "";
for (int i = 0; i < foo.length; ++i)
{
    result += bar(foo[i]);  // Bad
}

试试这个:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < foo.length; ++i)
{
    sb.append(bar(foo[i]));
}
String result = sb.toString();

编译器只优化简单的a + b + c表达式。它无法自动优化上述代码。

于 2012-08-13T21:11:50.013 回答
3

您在哪里假设字符串连接在内部使用 stringbuilder ?也许一个简单的 concat 会被优化掉,但这绝对不会:

String s = "";

for (int i = 0; i < 1000; i++){
  for (int j = 0; j < 1000; j++){
    s+= "" + i + j
}
}
于 2012-08-13T21:12:34.263 回答