2013-03-18 4 views
3

J'ai passé en revue mon code compilé avec la ligne de commande javac et j'ai vu chaque fois que j'ai utilisé la concaténation de chaînes avec opérateur +, le code compilé remplacé par la méthode append() de StringBuilder. maintenant, je pense que l'utilisation de StringBuilder et la concaténation de chaînes ont la même performance, car ils ont un bytecode similaire, est-ce correct?java: String concat dans bytecode converti en StringBuilder

Répondre

11

Oui, c'est vrai! Mais lorsque vous concaténer en boucle le comportement diffère. par exemple.

String str = "Some string"; 
for (int i = 0; i < 10; i++) { 
    str += i; 
} 

nouveau StringBuilder sera construit à chaque itération de la boucle unique (avec une valeur initiale de str) et à la fin de chaque itération, il y aura concaténation avec chaîne initiale (en fait StringBuilder avec la valeur initiale de str).
Vous devez donc créer StringBuilder par vous-même uniquement lorsque vous utilisez la concaténation de chaînes en boucle.

0

La principale différence (et la raison pour laquelle le compilateur utilise StringBuilder pour la concaténation de chaîne) est que String est immuable, alors que StringBuilder n'est pas. Par exemple, si vous calculez s1 + s2 + s3 en utilisant des chaînes seules, vous devrez copier les caractères s1 deux fois. Cela peut être (et est) évité en utilisant StringBuilder.

Cette optimisation est explicitement autorisée par le JLS:

Une mise en œuvre peut choisir d'effectuer la conversion et concaténation en une seule étape pour éviter de créer puis jeter un objet de chaîne intermédiaire. Pour augmenter les performances de la concaténation de chaîne répétée, un compilateur Java peut utiliser la classe StringBuffer ou une technique similaire pour réduire le nombre d'objets String intermédiaires créés par l'évaluation d'une expression.