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 .
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.
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.
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.
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
.
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.
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!)
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 ()
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.
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.