如果你只在寻找性能,我相信使用是构建字符串的最有效方法。即使Java编译器足够聪明,可以将大多数字符串串联转换为等效的字符串。StringBuilder/StringBuffer
StringBuilder
如果您正在寻找可读性,那么我认为事情会更清晰,除非我需要依赖高性能,否则这也是我使用的。String.format
因此,如果您主要关注的不是性能,这意味着此代码不在调用很多的路径中,您可能更喜欢使用,因为它可以更好地了解生成的字符串(如您所说)。String.format
此外,使用可以让你使用格式的东西,这意味着你可以用它来填充字符串,格式化数字,日期等,如果使用简单的串联,这将使代码变得更糟。String.format
编辑 Chuu:
使用 JAD,您可以看到以下代码:
public class Test {
public static void main(String[] args) {
String str = "a" + "b" + "c";
String str2 = "foo" + str + "bar" + str;
System.out.println(str2);
}
}
反编译时将如下所示:
public class Test {
public static void main(String[] args) {
String str = "abc";
String str2 = new StringBuilder("foo").append(str).append("bar").append(str).toString();
System.out.println(str2);
}
}
也可以使用实用程序找到证明,该实用程序将在文件下显示Java字节码:javap
.class
public static void main(java.lang.String[] args);
0 ldc <String "abc"> [16]
2 astore_1 [str]
3 new java.lang.StringBuilder [18]
6 dup
7 ldc <String "foo"> [20]
9 invokespecial java.lang.StringBuilder(java.lang.String) [22]
12 aload_1 [str]
13 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
16 ldc <String "bar"> [29]
18 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
21 aload_1 [str]
22 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
25 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [31]
28 astore_2 [str2]
29 getstatic java.lang.System.out : java.io.PrintStream [35]
32 aload_2 [str2]
33 invokevirtual java.io.PrintStream.println(java.lang.String) : void [41]
36 return