web-dev-qa-db-fra.com

Pourquoi utiliser explicitement StringBuilder si le compilateur convertit automatiquement la concaténation de chaînes en StringBuilder?

Duplicata possible:
StringBuilder vs concaténation de chaînes dans toString () en Java

Je me demande, puisque le compilateur utilise en interne un StringBuilder pour ajouter des chaînes lors de l'exécution de la concaténation de chaînes, alors quel est le point et pourquoi devrais-je prendre la peine d'utiliser StringBuilder si la concaténation de chaînes a déjà fait le travail pour vous? Y a-t-il d'autres raisons spécifiques?

38
peter

Comme vous le mentionnez, vous ne devez pas utiliser StringBuilder au lieu d'une simple expression de concaténation de chaînes telle que a + " = " + b. Ce dernier est plus rapide à taper, plus facile à lire et le compilateur utilisera de toute façon un StringBuilder en interne, donc il n'y a aucun avantage en termes de performances en le réécrivant.

Cependant, StringBuilder est utile si vous concaténez un grand nombre de chaînes dans une boucle. Le code suivant est inefficace. Il nécessite O (n2) le temps de s'exécuter et crée de nombreuses chaînes temporaires.

String result = "";
for (int i = 0; i < foo.length; ++i)
{
    result += bar(foo[i]);  // Bad
}

Essayez plutôt ceci:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < foo.length; ++i)
{
    sb.append(bar(foo[i]));
}
String result = sb.toString();

Le compilateur optimise uniquement les simples a + b + c expressions. Il ne peut pas optimiser automatiquement le code ci-dessus.

65
Mark Byers

Où supposez-vous cette concaténation de chaînes en utilisant stringbuilder en interne? Peut-être qu'un simple concat est optimisé, mais ce ne sera certainement pas:

String s = "";

for (int i = 0; i < 1000; i++){
  for (int j = 0; j < 1000; j++){
    s+= "" + i + j
}
}
3
Falmarri