JAVA 6は文字列累加を使用できます


詳細
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