Ваш пример фактически не будет использовать StringBuilder
, потому что ни один из элементов не является переменным. Поскольку «a», 1 и «b» - все литералы, компилятор сделает для вас один String
! Однако, если вы включили переменную в эту String
конкатенацию, то она будет использовать StringBuilder
и потребуются отдельные String
s для объединенных элементов.
Для вашего примера компилятор создаст один строковый литерал:
const #2 = String #21; // a1b
public void foo();
Code:
Stack=1, Locals=2, Args_size=1
0: ldc #2; //String a1b
2: astore_1
3: return
LineNumberTable:
line 7: 0
line 8: 3
Допустим, вместо этого мы написали
public void bar(String c)
{
String s = "a" + c + "b";// 1.
}
Теперь компилятору нужно будет создать StringBuilder
, и он будет использовать константы a и b ASCII с символами StringBuilder
.
const #20 = Asciz a;
const #22 = Asciz b;
public void bar(java.lang.String);
Code:
Stack=2, Locals=3, Args_size=2
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: ldc #4; //String a
9: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava /lang/String;)Ljava/lang/StringBuilder;
12: aload_1
13: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: ldc #6; //String b
18: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_2
25: return
LineNumberTable:
line 7: 0
line 8: 25