En Java, existe-t-il une différence de performances entre l'utilisation de l'opérateur "+" et StringBuilder?


Réponse 1:

En Java, existe-t-il une différence de performances entre l'utilisation de l'opérateur "+" et StringBuilder?

Sur une seule ligne comme celles-ci:

String string1 = "un" + "deux";
String string2 = new StringBuilder ("un"). Append ("deux"). ToString ();

Il ne devrait pas y avoir de différence de performances. En fait, dans les écosystèmes Java modernes, le premier est optimisé pour le second au moment de la compilation. Pour voir cela en action, essayez d'entrer dans le premier en utilisant votre débogueur préféré.

Cependant, si vos chaînes de concaténation sur des lignes distinctes ou, disons, dans une boucle for:

String string1 = “”;
StringBuilder sb = new StringBuilder ();

pour (Entier i = 0; i <5; i ++) {
  chaîne1 = chaîne1 + i.toString ();
  sb.append (i.toString ());
}

String string2 = sb.toString ();

Ensuite, l'utilisation d'un StringBuilder est plus «efficace» et est parfois le moyen préféré de construire une chaîne plus complexe. Pour autant que je sache, aucun compilateur Java n'optimise actuellement la répétition des + à StringBuilder.


Réponse 2:

Réponse courte: il peut y en avoir, mais la plupart du temps cela ne vaut pas la peine de s'inquiéter. Privilégiez un code clair plutôt qu'une optimisation prématurée.

Les machines virtuelles Java modernes peuvent optimiser la concaténation de chaînes avec "+" et la transformer en StringBuilder, et comme elles peuvent voir la durée de la chaîne résultante, elles peuvent allouer la taille correcte au StringBuilder au début. Si vous créez vous-même un StringBuilder en utilisant la taille de tableau par défaut, le tableau de caractères devra peut-être être agrandi plus tard, ce qui implique une copie du tableau, ce qui pourrait en fait être plus lent.

Depuis Java 9, la concaténation de chaînes est beaucoup plus optimisée, avec une stratégie décidée lors de l'exécution.

Si vous ajoutez plusieurs fois à une chaîne dans une boucle, vous ne pouvez probablement pas vous tromper en utilisant un StringBuilder, mais allouez la taille correcte à l'avance si elle est connue. En dehors des boucles, restez avec "+" chaque fois qu'il serait plus lisible; et espérez que la JVM est, ou sera bientôt, meilleure à optimiser que vous.