如果您只追求性能,我相信 usingStringBuilder/StringBuffer
是构建字符串的最有效方式。即使 Java 编译器足够聪明,可以将大多数 String 连接转换为StringBuilder
等价物。
如果您正在寻找可读性,String.format
我认为事情会更清晰,这也是我使用的,除非我需要依赖高性能。
因此,如果您主要关心的不是性能,这意味着此代码不在一个被大量调用的路径中,您可能更喜欢使用String.format
它,因为它可以更好地了解结果字符串(就像您说的那样)。
此外,usingString.format
允许您使用 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