Java: String concat vs StringBuilder - optimisé, que dois-je faire?
Dans cette réponse, il est dit (implique) que la concaténation de Chaîne est optimisé en StringBuilder opérations de toute façon, quand j'écris mon code, est-il une raison pour écrire StringBuilder code dans la source? Notez que mon cas est différent de l'OP de la question, comme je suis la concaténation/ajoutez des centaines de milliers de lignes.
Pour me faire plus clair: je suis bien conscient des différences de chacun, c'est juste que je ne sais pas si il vaut la peine de l'écrire StringBuilder code parce que c'est moins lisible et lors de sa soi-disant plus lent cousin, la classe String, est converti automatiquement dans le processus de compilation de toute façon.
- Voici une bonne analyse: javacodegeeks.com/2013/03/java-stringbuilder-myth-debunked.html
Vous devez vous connecter pour publier un commentaire.
Je pense que l'utilisation de
StringBuilder
vs+
dépend vraiment du contexte d'une utilisation en.Généralement à l'aide de JDK 1.6 et au-dessus, le compilateur va rejoindre automatiquement les chaînes ensemble à l'aide de
StringBuilder
.Cela permettra de compiler
String three
comme:Cela est très utile et nous sauve certains d'exécution. Cependant, ce processus n'est pas toujours optimale. Prenons, par exemple:
Si on compile en bytecode puis décompiler le bytecode généré, nous obtenons quelque chose comme:
Le compilateur a optimisé la boucle interne, mais n'a certainement pas fait le meilleur possible optimisations. Notre code pour l'améliorer, nous pourrions utiliser:
Maintenant, c'est plus optimal que le compilateur a généré code, donc il ya certainement un besoin d'écrire du code à l'aide de la
StringBuilder
/StringBuffer
classes dans les cas où un code efficace est nécessaire. Les compilateurs actuels ne sont pas très bien pour gérer la concaténation de chaînes de caractères dans les boucles, cependant, cela pourrait changer à l'avenir.Vous devez regarder attentivement pour voir où vous devez appliquer manuellement
StringBuilder
et d'essayer de l'utiliser lorsque cela ne va pas réduire la lisibilité de votre code de trop.Note: j'ai compilé le code à l'aide de JDK 1.6, et et décompilé le code à l'aide de la
javap
programme, qui crache du byte-code. Il est assez facile de les interpréter et est souvent une référence utile de regarder en essayant d'optimiser le code. Le compilateur ne vous changer le code de derrière les coulisses de sorte qu'il est toujours intéressant de voir ce que ça donne!StringBuilder
pour chaque itération de boucle? Pourquoi en serait-elle optimale?La phrase clé dans votre question est "soi-disant plus lent". Vous devez vous identifier si c'est en effet un goulot d'étranglement, et ensuite voir ce qui est plus rapide.
Si vous êtes sur le point d'écrire ce code, mais n'ont pas encore écrit, puis écrire ce qui est plus clair pour vous et puis si nécessaire de voir si c'est un goulot d'étranglement.
Alors qu'il est logique d'utiliser le code que vous considérez plus likey pour être plus rapide, si les deux sont tout aussi lisible, en fait de prendre du temps pour savoir qui est plus rapide lorsque vous n'avez pas un besoin est une perte de temps. La lisibilité de rendement ci-dessus jusqu'à ce que le rendement est inacceptable.
Il dépend du cas, mais StringBuilder est pensé pour être un peu plus rapide. Si vous faites de la concaténation de l'intérieur d'une boucle alors je vous suggérons d'utiliser StringBuilder.
De toute façon, je vous conseille de profil et de tester votre code (si vous faites un tel ajout).
Attention tout de même: les instances de StringBuilder sont mutables et ne doivent pas être partagées entre les threads (sauf si vous savez vraiment ce que vous faites.) par opposition à la Chaîne, qui sont immuables.
Je pourrais vous ai mal compris votre question, mais StringBuilder est plus rapide lors de l'ajout de Chaînes de caractères. Donc, oui, si vous ajoutez "des centaines de milliers de lignes", vous devriez certainement utiliser StringBuilder (ou StringBuffer si vous exécutez une application multithread).
(Plus approfondie de la réponse dans les commentaires)