如果编译器自动将字符串连接转换为StringBuilder,为什么要显式使用StringBuilder?

时间:2012-08-13 21:10:28

标签: java stringbuilder

  

可能重复:
  StringBuilder vs String concatenation in toString() in Java

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

2 个答案:

答案 0 :(得分:61)

正如您所提到的,您不应该使用StringBuilder而不是简单的字符串连接表达式,例如a + " = " + b。后者输入速度更快,更易于阅读,编译器内部也会使用StringBuilder,因此重写它没有性能优势。

但是,如果要在循环中连接大量字符串,则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表达式。它无法自动优化上述代码。

答案 1 :(得分:3)

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

String s = "";

for (int i = 0; i < 1000; i++){
  for (int j = 0; j < 1000; j++){
    s+= "" + i + j
}
}