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

2022-09-01 02:31:30

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

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


答案 1

如前所述,不应使用简单的字符串串联表达式(如 .后者键入速度更快,更易于阅读,并且编译器无论如何都会在内部使用,因此重写它没有性能优势。StringBuildera + " = " + bStringBuilder

但是,如果要在循环中连接大量字符串,则非常有用。下面的代码效率低下。它需要 O(n2) 时间才能运行,并创建许多临时字符串。StringBuilder

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


答案 2

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

String s = "";

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

推荐