最新バージョンの Java(1.8) を使用すると、disassembly( javap -c
) は、コンパイラによって導入された最適化を示します。+
同様sb.append()
に、非常によく似たコードが生成されます。+
ただし、 for ループで使用している場合は、動作を調べる価値があります。
for ループで + を使用して文字列を追加する
ジャワ:
public String myCatPlus(String[] vals) {
String result = "";
for (String val : vals) {
result = result + val;
}
return result;
}
ByteCode:(for
ループ抜粋)
12: iload 5
14: iload 4
16: if_icmpge 51
19: aload_3
20: iload 5
22: aaload
23: astore 6
25: new #3 // class java/lang/StringBuilder
28: dup
29: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
32: aload_2
33: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
36: aload 6
38: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
41: invokevirtual #6 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
44: astore_2
45: iinc 5, 1
48: goto 12
stringbuilder.append を使用して文字列を追加する
ジャワ:
public String myCatSb(String[] vals) {
StringBuilder sb = new StringBuilder();
for(String val : vals) {
sb.append(val);
}
return sb.toString();
}
ByteCdoe:(for
ループ抜粋)
17: iload 5
19: iload 4
21: if_icmpge 43
24: aload_3
25: iload 5
27: aaload
28: astore 6
30: aload_2
31: aload 6
33: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
36: pop
37: iinc 5, 1
40: goto 17
43: aload_2
ただし、少し明白な違いがあります。使用された最初のケースでは、 for ループの反復ごとに+
newが作成され、生成された結果は呼び出し (29 から 41) を実行して格納されます。そのため、ループで演算子を使用している間は本当に必要のない中間文字列を生成しています。StringBuilder
toString()
+
for