Je sais que le compilateur Javac est capable de transformer la concaténation de String +
en utilisant StringBuilder
/ StringBuffer
et je suis curieux de savoir à partir de quelle version ce changement a été introduit ?
J'utilise cet exemple de code :
public class Main {
public static void main(String[] args) {
String a = args[0];
String s = "a";
s = s + a;
s = s + "b";
s = s + "c";
s = s + "d";
s = s + "e";
System.out.println(s);
}
}
Jusqu'à présent, j'ai essayé avec javac 1.8.0_121
, javac 1.6.0_20
, javac 1.5.0_22
y java 1.4.2_19
.
Voici un exemple du bytecode que je vois utiliser javap -c
de 1.4.2_19
:
6: astore_2
7: new #3; //class StringBuffer
10: dup
11: invokespecial #4; //Method java/lang/StringBuffer."<init>":()V
14: aload_2
15: invokevirtual #5; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
18: aload_1
19: invokevirtual #5; //Method java/lang/StringBuffer.append:(Ljava/lang/String;)Ljava/lang/StringBuffer;
22: invokevirtual #6; //Method java/lang/StringBuffer.toString:()Ljava/lang/String;
Les 4 versions semblent utiliser l'optimisation StringBuilder/StringBuffer, donc je suis curieux de savoir à partir de quelle version de Javac ce changement a été introduit ?