Si le code suivant:
String s = new StringBuilder().append("a").append(1).append("b");
3 Réponses :
Je pense que vous mélangez un peu ... p>
pour le Le + code> - la casse, il y aura un
"A1" code> -Object créé lors de l'évaluation
"A" + 1 code> (droite Avant de concaténer
"A1" code> avec
"B" code>). Cette création d'objet supplémentaire peut être évitée lors de l'utilisation de la méthode code> code>. C'est tout. P>
"A" code> et
"B" code> sera déjà créé pendant la compilation. (Ces littéraux constants seront présents dans la piscine piquante dès le début.) Mais comme vous le savez probablement, ces constantes seront également créées dans le cas code> p>
Je suppose que vous vous demandez pourquoi il est plus efficace d'utiliser Prenons par exemple le code suivant: P> stringbuilder code> au lieu de l'opérateur
+ code> sur les chaînes. Dans votre exemple, la différence est négligeable, mais vous devez envisager des problèmes plus importants, résultant généralement de la boucle.
String s = "";
for(int i = 0; i < 100000; i++) {
s = s + "something";
}
Votre exemple n'utilisera pas réellement un Pour votre exemple, le compilateur créerait un seul littéral à chaîne: P> disons que nous avions à la place écrit p> stringbuilder code> car aucun des éléments n'est des variables. Parce que "A", 1 et "B" sont tous des littéraux, le compilateur fera une seule chaîne
code> pour vous! Si, toutefois, vous avez inclus une variable dans cette concaténation code> chaîne code>, il utiliserait un
stringbuilder (code> et nécessiterait une chaîne
distincte code> S pour les éléments concatérés .
StringBuilder CODE>, et il utilisera les littéraux A A et B Constant ASCII avec le
StringBuilder CODE>. P>
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
Si le code est dans FOO.JAVA compilé à FOO.CLASS, utilisez Javap -C -V FOO code> pour obtenir la sortie de décompilation affichée. Il est très instructif de le faire, surtout sur des exemples simples comme le vôtre. (Je viens de choisir les bits intéressants de la sortie Javap.)
Plus à votre réponse, les objets A et B doivent être créés afin de les transmettre en tant que paramètres sur stringbuilder.append () code>.