JAVA 6は文字列累加を使用できます
詳細
JAVA 6では、コンパイラは常に文字列の累加操作を最適化してコンパイルします.
コンパイラは文字列の累加をStringBuilderにコンパイルします.
ソースコード
コンパイル後
コンパイラは文字列を累積して文字列にコンパイルします
ソースコード
コンパイル後
ベストプラクティス:文字列を先につなぎ合わせ、変数をつなぎ合わせる
以上から,第2の文字列の累積の効率がより高いことが分かる.
「bb」+「cc」は先に「bbcc」にコンパイルされるからです.aa+「bb」+「cc」に変数が現れ、
変数後の文字列はStringBuilderにコンパイルされます.
ソースコード
コンパイル後
ベストプラクティス:ロールアップ操作をループで使用しない
StringBuilderはループ内で作成されるためです.手動で外部にStringBuilderを作成することをお勧めします.
ソース:
解析ツールjava asm
JAVA 6では、コンパイラは常に文字列の累加操作を最適化してコンパイルします.
コンパイラは文字列の累加をStringBuilderにコンパイルします.
ソースコード
String aa = "aa";
String bb = "bb";
String cc = "cc";
String result = aa + bb + cc;
コンパイル後
NEW StringBuilder
DUP
ALOAD 1: aa
INVOKESTATIC String.valueOf(Object) : String
INVOKESPECIAL StringBuilder.(String) : void
ALOAD 2: bb
INVOKEVIRTUAL StringBuilder.append(String) : StringBuilder
ALOAD 3: cc
INVOKEVIRTUAL StringBuilder.append(String) : StringBuilder
INVOKEVIRTUAL StringBuilder.toString() : String
ASTORE 4: result
コンパイラは文字列を累積して文字列にコンパイルします
ソースコード
String s="aa"+"bb"+"cc";
コンパイル後
LDC "aabbcc"
ベストプラクティス:文字列を先につなぎ合わせ、変数をつなぎ合わせる
以上から,第2の文字列の累積の効率がより高いことが分かる.
aa + "bb"+"cc" "bb"+"cc"+aa。
「bb」+「cc」は先に「bbcc」にコンパイルされるからです.aa+「bb」+「cc」に変数が現れ、
変数後の文字列はStringBuilderにコンパイルされます.
ソースコード
String aa = "aa";
String result3 = aa + "bb"+"cc";
String result4 = "bb"+"cc"+aa;
コンパイル後
L0 (0)
LDC "aa"
ASTORE 1: aa
L1 (3)
NEW StringBuilder
DUP
ALOAD 1: aa
INVOKESTATIC String.valueOf(Object) : String
INVOKESPECIAL StringBuilder.(String) : void
LDC "bb"
INVOKEVIRTUAL StringBuilder.append(String) : StringBuilder
LDC "cc"
INVOKEVIRTUAL StringBuilder.append(String) : StringBuilder
INVOKEVIRTUAL StringBuilder.toString() : String
ASTORE 2: result3
L2 (15)
NEW StringBuilder
DUP
LDC "bbcc"
INVOKESPECIAL StringBuilder.(String) : void
ALOAD 1: aa
INVOKEVIRTUAL StringBuilder.append(String) : StringBuilder
INVOKEVIRTUAL StringBuilder.toString() : String
ASTORE 3: result4
L3 (24)
RETURN
L4 (26)
ベストプラクティス:ロールアップ操作をループで使用しない
StringBuilderはループ内で作成されるためです.手動で外部にStringBuilderを作成することをお勧めします.
StringBuilder eqPhone = new StringBuilder();
// # -
for (String phoneNum : wwPhone.split("#")) {
if (StringUtil.isNotBlank(phoneNum)) {
eqPhone.append(phoneNum).append("-");
}
}
ソース:
public static void a()
{
String s1="1";
for (int i = 0; i <10; i++) {
s1+="2";
}
}
バイトコード:public static void a();
0 ldc [56]
2 astore_0 [s1]
3 iconst_0
4 istore_1 [i]
5 goto 31
8 new java.lang.StringBuilder [54] //
11 dup
12 aload_0 [s1]
13 invokestatic java.lang.String.valueOf(java.lang.Object) : java.lang.String [77]
16 invokespecial java.lang.StringBuilder(java.lang.String) [58]
19 ldc [69]
21 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [61]
24 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [65]
27 astore_0 [s1]
28 iinc 1 1 [i]
31 iload_1 [i]
32 bipush 10
34 if_icmplt 8 // 8
37 return
解析ツールjava asm