如果编译器自动将字符串串联转换为 StringBuilder,为什么显式使用 StringBuilder?
2022-09-01 02:31:30
我想知道,由于编译器内部使用StringBuilder在执行字符串串联时附加字符串,那么如果字符串连接已经为您完成了这项工作,那么有什么意义以及为什么我应该费心使用StringBuilder?还有其他具体原因吗?
我想知道,由于编译器内部使用StringBuilder在执行字符串串联时附加字符串,那么如果字符串连接已经为您完成了这项工作,那么有什么意义以及为什么我应该费心使用StringBuilder?还有其他具体原因吗?
如前所述,不应使用简单的字符串串联表达式(如 .后者键入速度更快,更易于阅读,并且编译器无论如何都会在内部使用,因此重写它没有性能优势。StringBuilder
a + " = " + b
StringBuilder
但是,如果要在循环中连接大量字符串,则非常有用。下面的代码效率低下。它需要 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
您在哪里假设字符串连接在内部使用字符串生成器?也许一个简单的 concat 会被优化掉,但这绝对不会:
String s = "";
for (int i = 0; i < 1000; i++){
for (int j = 0; j < 1000; j++){
s+= "" + i + j
}
}