在 Java 1.7+ 上,我们是否仍需要使用 StringBuffer.append 转换 "this string" + "should" + "be" + "joined" 以获得最佳实践?

On Java 1.7+ should we still need to convert "this string" + "should" + "be" + "joined" using StringBuffer.append for best practices?

在 Java 1.7+ 上我们是否还需要使用 StringBuffer.append 转换 "this string" + "should" + "be" + "joined"做法?

1) 常量表达式 (JLS 15.28) 像 "this string" + " should" + " be" + " joined" 不需要 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);
    }
// 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 发布后写成)。