Quand utiliser StringBuilder en Java [dupliquer]

cette question a déjà une réponse ici:

  • StringBuilder vs concaténation de Chaîne dans toString() en Java 18 réponses

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: Est-ce que le haut de la création d'un objet StringBuilder , appelant la méthode append() et finalement toString() est déjà plus petit que la concaténation des chaînes existantes avec l'opérateur + pour deux chaînes, ou est-ce seulement conseillé pour plus (que deux) chaînes?

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

et enfin, voulez-vous échanger la lisibilité et concision de la concaténation + pour l'exécution du StringBuilder dans des cas plus petits comme deux, trois ou quatre cordes?

utilisation Explicite de StringBuilder pour des concaténations est mentionné comme obsolète au obsolète Java conseils d'optimisation ainsi qu'à Java mythes urbains .

305
demandé sur Peter Mortensen 2011-01-10 11:52:30

9 réponses

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

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

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

si vous avez une seule déclaration,

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

, alors vous pouvez utiliser String s, parce que le compilateur utilisera StringBuilder automatiquement.

429
répondu Ralph 2016-02-25 11:50:32

la réponse de Ralph est fabuleuse. Je préférerais utiliser la classe StringBuilder pour construire/décorer la chaîne de caractères parce que l'utilisation de celle-ci ressemble plus à un modèle de constructeur.

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 helper/builder pour construire la chaîne, pas la chaîne elle-même.

48
répondu zawhtut 2011-01-10 09:47:31

en règle générale, toujours utiliser le code plus lisible et seulement refactoriser si la performance est un problème. Dans ce cas précis, les JDK les plus récents optimiseront le code dans la version StringBuilder dans tous les cas.

vous n'avez généralement vraiment besoin de le faire manuellement que si vous faites la concaténation de chaîne dans une boucle ou dans un code complexe que le compilateur ne peut pas facilement optimiser.

34
répondu Riaan Cornelius 2011-03-23 19:25:06

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 plus récent ou votre implémentation Java font un certain type d'opération de chaîne de caractères mieux avec String ou mieux avec StringBuilder .

7
répondu Michał Niklas 2012-12-26 12:25:21

certains compilateurs ne peuvent remplacer aucune concaténation de chaîne par des équivalents StringBuilder. Assurez-vous de tenir compte des compilateurs que votre source utilisera avant de vous fier aux optimisations du temps de compilation.

5
répondu William Morrison 2013-02-12 16:17:39

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 exigences de mémoire et de complexité d'exécution proportionnelles à la longueur des deux chaînes. StringBuilder fonctionne plus efficacement.

Cependant j'ai lu ici que le concatination code à l'aide de l' + un opérateur n'est changé à StringBuilder sur le post Java 4 compilateurs. Donc, cela pourrait ne pas être du tout un problème. (Mais je voudrais vraiment voir cette déclaration si j'en dépends dans mon code!)

4
répondu spa 2011-01-10 09:10:10

pour deux cordes concat est plus rapide, dans d'autres cas StringBuilder est un meilleur choix, Voir mon explication dans opérateur de concaténation ( + ) vs concat ()

4
répondu Evgeniy Dorofeev 2017-05-23 12:34:53

le problème avec la concaténation de la chaîne est qu'elle conduit à la copie de L'objet String 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 devriez pas faire de concaténation de Chaîne dans une boucle, qui sera appelé souvent. Je suppose que faire quelques concaténations ici et il ne vous fera pas de mal tant que vous ne parlez pas des centaines et cela dépend bien sûr sur vos exigences de performances. Si vous faites des choses en temps réel, vous devriez être très prudent.

3
répondu Navi 2011-01-10 09:06:40

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

2
répondu Babak Naffas 2011-01-10 08:57:25