MetallicPriest:
私は、文字列を構築するための「+」連結演算子を使用すると、非常に非効率的であることを知って、それはStringBuilderクラスを使用することをお勧めしている理由であるが、この種のパターンがあまりにも非効率的である場合、私は不思議でしたか?
String some = a + "\t" + b + "\t" + c + "\t" + d + "\t" + e;
私は、コンパイラが割り当て罰金を最適化するか、しません、ここで推測しますか?
チャールズDowbecki:
この特定の例では、コンパイラによってインライン化されます。
String a = "a";
String b = "bb";
String c = "ccc";
String some = a + "\t" + b + "\t" + c;
Javaの9+が使用して、これをインライン化しますmakeConcatWithConstantsとinvokedynamicのそれを効率的にします。あたりとしてjavap -v
出力:
Code:
stack=3, locals=5, args_size=1
0: ldc #2 // String a
2: astore_1
3: ldc #3 // String bb
5: astore_2
6: ldc #4 // String ccc
8: astore_3
9: aload_1
10: aload_2
11: aload_3
12: invokedynamic #5, 0 // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
17: astore 4
19: return
しかしもしa
b
とc
、さらにコードを最適化するコンパイラのコンパイル時定数であります:
final String a = "a";
final String b = "bb";
final String c = "ccc";
String some = a + "\t" + b + "\t" + c;
そしてsome
一定の値がロードされます。
Code:
stack=1, locals=5, args_size=1
0: ldc #2 // String a
2: astore_1
3: ldc #3 // String bb
5: astore_2
6: ldc #4 // String ccc
8: astore_3
9: ldc #5 // String a\tbb\tccc
11: astore 4
13: return
他の事情などでfor
ループコンパイラが最適化されたコードを生成することができない場合がありますので、StringBuilder
速いかもしれません。