我认为在使用StringBuilder
和+
时,取决于你使用的上下文。
通常情况下,在使用JDK 1.6及以上版本编译器时,编译器会自动使用StringBuilder
将字符串连接在一起。
String one = "abc";
String two = "xyz";
String three = one + two;
这将会把 String three
编译为:
String three = new StringBuilder().append(one).append(two).toString();
这非常有帮助,可以节省一些运行时间。然而,这个过程并不总是最优的。以以下为例:
String out = "";
for( int i = 0; i < 10000 ; i++ ) {
out = out + i;
}
return out;
如果我们将代码编译为字节码,然后再反编译生成的字节码,我们会得到类似以下内容:
String out = "";
for( int i = 0; i < 10000; i++ ) {
out = new StringBuilder().append(out).append(i).toString();
}
return out;
编译器已经优化了内部循环,但肯定没有做到最佳的优化。为了改进我们的代码,我们可以使用:
StringBuilder out = new StringBuilder();
for( int i = 0 ; i < 10000; i++ ) {
out.append(i);
}
return out.toString();
现在,使用 StringBuilder
/StringBuffer
类编写代码可比编译器生成的代码更加优化,因此在需要高效代码的情况下需要使用它们。然而,当前的编译器在循环中连接字符串方面并不擅长,但是这可能会在未来发生改变。
您需要仔细查看需要手动应用 StringBuilder
的地方,并尽可能在不降低代码可读性的情况下使用它。
注意:我使用 JDK 1.6 编译代码,并使用 javap
程序反编译代码,该程序可以输出字节码。这相当容易解释,通常在优化代码时很有用。编译器确实在幕后更改您的代码,因此查看其作用总是很有趣的!