web-dev-qa-db-fra.com

Quand utiliser StringBuilder dans Java

Il est généralement préférable d'utiliser un StringBuilder pour la concaténation de chaînes en Java. Est-ce toujours le cas?

Ce que je veux dire, c’est ceci: c’est la surcharge de créer un objet StringBuilder, d’appeler la méthode append() et enfin toString() déjà plus petit que de concaténer des chaînes existantes avec l’opérateur + à deux chaînes, ou est-ce seulement recommandé pour plus (que deux) chaînes?

S'il existe un tel seuil, de quoi dépend-il (peut-être la longueur de la chaîne, mais de quelle manière)?

Et enfin, échangeriez-vous la lisibilité et la concision de la concaténation + contre la performance de la StringBuilder dans des cas plus petits tels que deux, trois ou quatre chaînes?

L'utilisation explicite de StringBuilder pour les concaténations régulières est mentionnée comme obsolète à conseils d'optimisation obsolètes Java ainsi qu'à mythes urbains de Java .

335
kostja

Si vous utilisez la concaténation de chaînes dans une boucle, quelque chose comme ceci,

String s = "";
for (int i = 0; i < 100; i++) {
    s += ", " + i;
}

alors vous devriez utiliser un StringBuilder (pas StringBuffer) au lieu d'un String, car il est beaucoup plus rapide et consomme moins de mémoire.

Si vous avez une seule déclaration,

String s = "1, " + "2, " + "3, " + "4, " ...;

vous pouvez alors utiliser Strings, car le compilateur utilisera automatiquement StringBuilder.

469
Ralph

La réponse de Ralph est fabuleuse. Je préférerais utiliser la classe StringBuilder pour construire/décorer la chaîne, car son utilisation ressemble davantage à un modèle de générateur.

public String decorateTheString(String orgStr){
            StringBuilder builder = new StringBuilder();
            builder.append(orgStr);
            builder.deleteCharAt(orgStr.length()-1);
            builder.insert(0,builder.hashCode());
            return builder.toString();
}

Il peut être utilisé comme assistant/constructeur pour construire la chaîne, pas la chaîne elle-même.

49
zawhtut

En règle générale, utilisez toujours le code le plus lisible et uniquement le refactor si les performances posent problème. Dans ce cas particulier, les derniers JDK optimiseront le code dans la version de StringBuilder dans tous les cas.

Vous devez généralement le faire manuellement si vous effectuez une concaténation de chaînes dans une boucle ou dans un code complexe que le compilateur ne peut pas optimiser facilement.

38
Riaan Cornelius

Regardez: http://www.javaspecialists.eu/archive/Issue068.html et http://www.javaspecialists.eu/archive/Issue105.html

Faites les mêmes tests dans votre environnement et vérifiez si le JDK le plus récent ou votre implémentation Java effectue mieux certains types d'opérations sur les chaînes avec String ou mieux avec StringBuilder.

7
Michał Niklas

Certains compilateurs ne peuvent remplacer aucune concaténation de chaîne par un équivalent de StringBuilder. Assurez-vous de choisir les compilateurs que votre source utilisera avant de vous appuyer sur les optimisations de temps de compilation.

5
William Morrison

L'opérateur + utilise public String concat(String str) en interne. Cette méthode copie les caractères des deux chaînes, de sorte qu'elle a des besoins en mémoire et une complexité d'exécution proportionnelle à la longueur des deux chaînes. StringBuilder fonctionne plus efficacement.

Cependant, j'ai lu ici que le code de concaturation utilisant l'opérateur + est remplacé par StringBuilder dans les compilateurs post Java 4. Donc, cela pourrait ne pas être un problème du tout. (Bien que je vérifierais vraiment cette déclaration si j'en dépend dans mon code!)

4
spa

Pour concaténer deux chaînes, c’est plus rapide, dans d’autres cas, StringBuilder est un meilleur choix. Voir mon explication dans opérateur de concaténation (+) vs concat ()

4
Evgeniy Dorofeev

Le problème avec la concaténation de chaînes est qu’elle conduit à la copie de l’objet Chaîne avec tous les coûts associés. StringBuilder n'est pas threadsafe et est donc plus rapide que StringBuffer, qui était le choix préféré avant Java 5. En règle générale, vous ne devez pas effectuer de concaténation de chaînes dans une boucle, qui sera appelée souvent. Je suppose que faire quelques concaténations ici et là ne vous fera pas de mal tant que vous ne parlez pas de centaines, cela dépend évidemment de vos exigences de performances. Si vous faites des choses en temps réel, vous devriez être très prudent.

3
Navi

Le matériel de certification Microsoft répond à cette même question. Dans le monde .NET, la surcharge de l'objet StringBuilder rend plus efficace la concaténation simple de 2 objets String. Je supposerais une réponse similaire pour les chaînes Java.

2
Babak Naffas