あなたがパフォーマンスだけを探しているなら、私は使用StringBuilder/StringBuffer
することが文字列を構築するための最も効率的な方法であると信じています。StringBuilder
Javaコンパイラが、ほとんどの文字列連結を同等のものに変換するのに十分賢い場合でも。
読みやすさを求めているなら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
の下にJavaバイトコードを表示するユーティリティを使用して見つけることもできます。.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