7
votes

Si la concaténation de chaîne à l'aide de + est implémentée à l'aide de StressBuilder, pourquoi les objets supplémentaires sont-ils créés lors de la concaténation?

Si le code suivant:

String s = new StringBuilder().append("a").append(1).append("b");


0 commentaires

3 Réponses :


1
votes

Je pense que vous mélangez un peu ...

pour le + - la casse, il y aura un "A1" -Object créé lors de l'évaluation "A" + 1 (droite Avant de concaténer "A1" avec "B" ). Cette création d'objet supplémentaire peut être évitée lors de l'utilisation de la méthode . C'est tout.

Le "A" et "B" 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


0 commentaires

2
votes

Je suppose que vous vous demandez pourquoi il est plus efficace d'utiliser 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.

Prenons par exemple le code suivant: P>

String s = "";
for(int i = 0; i < 100000; i++) {
   s = s + "something";
}


0 commentaires

5
votes

Votre exemple n'utilisera pas réellement un 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 .

Pour votre exemple, le compilateur créerait un seul littéral à chaîne: P> xxx pré>

disons que nous avions à la place écrit p> xxx pré> Maintenant, le compilateur devra créer un 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


2 commentaires

Si le code est dans FOO.JAVA compilé à FOO.CLASS, utilisez Javap -C -V FOO 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 () .