如果你只关注性能,我认为使用 StringBuilder/StringBuffer
是构建字符串最高效的方式。即使Java编译器聪明到能够将大多数字符串连接转换为 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);
}
}
通过使用 javap
工具可以证明,在 .class
文件下,它将显示 Java 字节码:
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
String.format
的第一个参数替换为具有不同参数顺序或措辞的参数。这是String.format
的一个巨大优势。 - Brian