可能重复:
StringBuilder vs String concatenation in toString() in Java如果编译器自动将字符串连接转换为StringBuilder,为什么要显式使用StringBuilder?
我很纳闷,因为编译器内部使用StringBuilder的追加2个字符串执行字符串连接时,那么还有什么意义?我为什么要费心使用StringBuilder如果字符串连接已经为你做了这项工作?还有其他具体原因吗?
可能重复:
StringBuilder vs String concatenation in toString() in Java如果编译器自动将字符串连接转换为StringBuilder,为什么要显式使用StringBuilder?
我很纳闷,因为编译器内部使用StringBuilder的追加2个字符串执行字符串连接时,那么还有什么意义?我为什么要费心使用StringBuilder如果字符串连接已经为你做了这项工作?还有其他具体原因吗?
如上所述,您不应使用StringBuilder
而不是简单的字符串连接表达式,如a + " = " + b
。后者键入速度更快,更易于阅读,编译器在内部也会使用StringBuilder
,所以重写它不会有性能优势。
但是,如果您在循环中连接大量字符串,则StringBuilder
非常有用。以下代码效率低下。它需要O(n )运行时间并创建许多临时字符串。
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
表达式。它不能自动优化上述代码。
你在哪里假设字符串连接在内部使用stringbuilder?也许一个简单的concat得到优化,但这绝对不会:
String s = "";
for (int i = 0; i < 1000; i++){
for (int j = 0; j < 1000; j++){
s+= "" + i + j
}
}
@JohanSjöberg是的,事实上它的确如此。执行'result + = bar(foo [i])'会产生像(假设为javac)'result = new StringBuilder()。append(result).append(foo [i])。toString()'的代码。注意这比使用一个'StringBuilder'完成更多的工作。 – oldrinb 2012-08-13 21:18:04
@JohanSjöberg关键是__样本不等于___ – oldrinb 2012-08-13 21:19:12
我还没那么清楚为什么?是否因为它需要在对第一个样本进行连接之前复制旧字符串(之前)? – peter 2012-08-13 21:21:04