Łatwy sposób sprawdzenia:
class StringTest {
public String toString() {
String zwrot = "";
for (int i = 1; i <= 1000000; i++)
zwrot += "A";
return zwrot;
}
}
Kompilujemy, a następnie wydajemy polecenie:
javap -c StringTest
Zobaczymy coś takiego:
class StringTest {
StringTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public java.lang.String toString();
Code:
0: ldc #2 // String
2: astore_1
3: iconst_1
4: istore_2
5: iload_2
6: ldc #3 // int 1000000
8: if_icmpgt 37
11: new #4 // class java/lang/StringBuilder
14: dup
15: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
18: aload_1
19: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: ldc #7 // String A
24: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
27: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
30: astore_1
31: iinc 2, 1
34: goto 5
37: aload_1
38: areturn
}
Widać, że kompilator użył klasy StringBuilder. Ale nie jest na tyle inteligentny, aby wyciągnąć tworzenie obiektu tej klasy przed pętlę.