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"+2+"3"+"4"+"6",编译期间直接就变成"12346"了
- 字符串通过StringBuilder来拼接,aa = aa+ bb+cc只会创建一个StringBuilder对象
- bb = aa+"fawef"又会创建一个StringBuilder对象
- 编译器有优化,但是不够完美,在频繁调用的场景,还是尽可能自己创建StringBuilder来使用.