在 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 发布后写成)。
在 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 发布后写成)。