String是怎么拼接的

117 阅读1分钟
public class Test {

    public void test() {

        String aa=  "1"+2+"3"+"4"+"6";

        String bb = "234";

        String cc = "fefe";

        aa = aa+ bb+cc;
        bb = aa+"fawef";
    }
}
public test()V
   L0
    LINENUMBER 7 L0
    LDC "12346"
    ASTORE 1
   L1
    LINENUMBER 9 L1
    LDC "234"
    ASTORE 2
   L2
    LINENUMBER 11 L2
    LDC "fefe"
    ASTORE 3
   L3
    LINENUMBER 13 L3
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
    ALOAD 1
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    ALOAD 2
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    ALOAD 3
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ASTORE 1
   L4
    LINENUMBER 14 L4
    NEW java/lang/StringBuilder
    DUP
    INVOKESPECIAL java/lang/StringBuilder.<init> ()V
    ALOAD 1
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    LDC "fawef"
    INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
    INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
    ASTORE 2
   L5
    LINENUMBER 15 L5
    RETURN
   L6
    LOCALVARIABLE this Lcom/miui/home/launcher/Test; L0 L6 0
    LOCALVARIABLE aa Ljava/lang/String; L1 L6 1
    LOCALVARIABLE bb Ljava/lang/String; L2 L6 2
    LOCALVARIABLE cc Ljava/lang/String; L3 L6 3
    MAXSTACK = 2
    MAXLOCALS = 4
}
  1. 可以看到,"1"+2+"3"+"4"+"6",编译期间直接就变成"12346"了
  2. 字符串通过StringBuilder来拼接,aa = aa+ bb+cc只会创建一个StringBuilder对象
  3. bb = aa+"fawef"又会创建一个StringBuilder对象
  4. 编译器有优化,但是不够完美,在频繁调用的场景,还是尽可能自己创建StringBuilder来使用.