在Java 1.7+上我们是否还需要使用StringBuffer.append转换“this string”+“should”+“be”+“join”以获得最佳实践?
答案 0 :(得分:10)
1)像"this string" + " should" + " be" + " joined"
这样的常量表达式(JLS 15.28)不需要StringBuilder,因为它在编译时计算成一个字符串"this string should be joined"
2)对于非常量表达式,编译器将自动应用StringBuilder。也就是说,"string" + var
相当于new StringBuilder().append("string").append(var).toString();
我们只需要在动态构造字符串时显式使用StringBuilder,就像这里
一样 StringBuilder s = new StringBuilder();
for (String e : arr) {
s.append(e);
}
答案 1 :(得分:1)
// using String concatentation
String str = "this string" + "should" + "be" + "joined";
// using StringBuilder
StringBuilder builder = new StringBuilder();
builder.append("this string");
builder.append("should");
builder.append("be");
builder.append("joined");
String str = builder.toString();
您使用原始String
级联与StringBuilder
的决定可能取决于代码的可读性和可维护性,而不是性能。在Oracle JVM下,使用直接String
连接,编译器实际上将使用单个StringBuilder
。结果,我上面给出的两个例子都有几乎相同的字节码。如果您发现自己进行了许多系列的原始String
连接,那么StringBuilder
可能会为您提供性能提升。有关详细信息,请参阅this article(在发布Java 7之后编写)。