Différence entre StringBuilder et StringBuffer
Quelle est la principale différence entre StringBuffer
et StringBuilder
?
Est-il des problèmes de rendement au moment de décider sur l'un quelconque de ces?
OriginalL'auteur blacktiger | 2008-12-10
Vous devez vous connecter pour publier un commentaire.
StringBuffer
est synchronisé,StringBuilder
ne l'est pas.et la synchronisation n'est pratiquement jamais nécessaire. Si quelqu'un veut synchroniser sur un StringBuilder, ils peuvent tout simplement entourent l'ensemble du bloc de code avec un synchronisée (sb) { } sur l'instance
Je dirais que StringBuffer est jamais une bonne idée (sauf si vous avez une API qui le nécessite) vanillajava.blogspot.de/2013/04/...
Seul endroit où je vois pour un StringBuffer est console comme sortie et d'enregistrement différents utilitaire: beaucoup de thread peut de sortie de conflit. Puisque vous ne voulez pas 2 sortie mêler... mais la synchronisation à StringBuffer niveau est trop bas niveau, vous souhaitez synchroniser à un appender comme levelm donc locka réponse est le meilleur et StringBuffer doit être désapprouvée. Cela permettrait d'économiser de la revue de code de temps avec les débutants.
Bon mnémonique pour ceux qui mélange ces deux - Tampon a été la Première, plus ancienne et donc la mise en œuvre synchronisée. Plus récente Constructeur de la classe utilise le Générateur de modèle et est asynchrone.
OriginalL'auteur sblundy
StringBuilder
est plus rapide queStringBuffer
car il n'est passynchronized
.Ici est un simple test de référence:
Un essai donne le nombre de
2241 ms
pourStringBuffer
vs753 ms
pourStringBuilder
.Vous avez besoin de se réchauffer avant de. Ce test est injuste pour StringBuffer. Aussi, il serait bon si elle a effectivement ajouté quelque chose. En fait, j'ai montré le test, et a joint une chaîne aléatoire et a obtenu le contraire de test. Va-à-dire que l'on ne peut pas faire confiance simple repères. À l'opposé montre StringBuffer est plus rapide. 5164 pour StringBuilder vs 3699 pour StringBuffer hastebin.com/piwicifami.avrasm
C'est la première fois que je vois
--> 0
dans une boucle. M'a fallu un moment pour comprendre ce que cela signifie. Est-ce quelque chose qui est effectivement utilisé dans la pratique, au lieu de l'habituel...; i > 0; i--
syntaxe?Que
i -->
est vraiment ennuyeux de la syntaxe sage... je pensais que c'était une flèche au premier abord à cause des commentaires sur art ASCII.D'autres conclure avec des résultats différents: alblue.bandlem.com/2016/04/jmh-stringbuffer-stringbuilder.html. Les références doivent vraiment être fait avec JMH, pas avec une simple
main()
Aussi, votre référence est injuste. Il n'y a pas de chauffe.OriginalL'auteur polygenelubricants
Fondamentalement,
StringBuffer
méthodes sont synchronisés tout enStringBuilder
ne le sont pas.Les opérations sont "presque" le même, mais en utilisant des méthodes synchronisées dans un seul thread est exagéré.
C'est à peu près à ce sujet.
Citation de StringBuilder API:
De sorte qu'il a été fait pour le remplacer.
La même chose s'est produite avec
Vector
etArrayList
.Hashtable
etHashMap
.OriginalL'auteur OscarRyz
Simplement utiliser
StringBuilder
à moins que vous êtes vraiment essayer de partager un tampon entre les threads.StringBuilder
est la désynchronisation (moins de charge = plus d'efficacité), frère cadet de l'original synchroniséStringBuffer
classe.StringBuffer
est venu en premier. Le soleil a été concerné avec exactitude dans toutes les conditions, alors ils ont fait synchronisé pour en faire thread-safe, juste au cas où.StringBuilder
est venu plus tard. La plupart des utilisations deStringBuffer
étaient mono-thread et paient le coût de la synchronisation.Depuis
StringBuilder
est un baisse-dans le remplacement pourStringBuffer
sans la synchronisation, il n'y aurait pas de différences entre les exemples.Si vous sont essayer de partager entre les threads, vous pouvez utiliser
StringBuffer
, mais d'examiner si de plus haut niveau de la synchronisation est nécessaire, par exemple, peut-être, au lieu d'utiliser StringBuffer, si vous synchronisez les méthodes qui utilisent le StringBuilder.très détaillée de la réponse!
OriginalL'auteur Bert F
Première permet de voir l' similitudes:
Les deux StringBuilder et StringBuffer sont mutables. Cela signifie que vous pouvez modifier le contenu d'entre eux, avec dans le même emplacement.
Différences:
StringBuffer est mutable et synchronisés. Où que StringBuilder est mutable, mais pas synchronisés par défaut.
Sens de la synchronisation (synchronisation):
Quand quelque chose est synchronisé, puis plusieurs threads peuvent accéder à, et de le modifier avec n'importe quel problème ou des effets secondaires.
StringBuffer est synchronisé, de sorte que vous pouvez l'utiliser avec plusieurs threads sans aucun problème.
À utiliser quand?
StringBuilder : Lorsque vous avez besoin d'une chaîne de caractères, qui peuvent être modifiables, et un seul thread est l'accès et la modification.
StringBuffer : Lorsque vous avez besoin d'une chaîne de caractères, qui peuvent être modifiables, et plusieurs threads sont l'accès et la modification.
Note : Ne pas utiliser de StringBuffer inutilement, c'est à dire, ne l'utilisez pas si un thread est en train de modifier et d'y accéder car il a beaucoup de verrouillage et de déverrouillage de code de synchronisation qui inutilement de prendre le temps CPU. Ne pas utiliser des verrous, sauf si cela est nécessaire.
OriginalL'auteur user1923551
Dans un seul fils, StringBuffer est pas significativement plus lent que StringBuilder, grâce à la JVM des optimisations. Et dans le multithreading, vous ne pouvez pas l'utiliser en toute sécurité un StringBuilder.
Voici mon test (pas une référence, juste un test) :
Résultats :
chaînes: 319740
Tampons : 23
Constructeur : 7 !
Ainsi les Constructeurs sont plus rapides que les Tampons, et de MANIÈRE plus rapide que la concaténation de chaînes de caractères.
Maintenant, nous allons utiliser un Exécuteur pour plusieurs threads :
Maintenant StringBuffers prendre 157 ms pour 100000 ajoute. Ce n'est pas le même test, mais par rapport à la précédente 37 ms, vous pouvez supposer que StringBuffers ajoute sont plus lents avec le multithreading utilisation. La raison en est que le JIT/point/compilateur/quelque chose qui le rend optimisations lorsqu'il détecte qu'il n'y a pas besoin pour vérifier les serrures.
Mais avec StringBuilder, vous avez java.lang.ArrayIndexOutOfBoundsException, parce qu'un des threads tente d'ajouter quelque chose où il ne devrait pas.
Conclusion est que vous n'avez pas à chasser StringBuffers. Et où vous avez threads, de penser à ce qu'ils font, avant d'essayer de gagner quelques nanosecondes.
Corrigé, merci. Évidemment, ça change des trucs.
Notez que
withString+="some string"+i+" ; ";
n'est pas équivalente pour les deux autres boucles et n'est donc pas une comparaison équitable.Exact, corrigé. La pensée chaînes sont encore très lents.
Pouvez-vous expliquer pourquoi le ArrayIndexOutOfBoundsException raise pour StringBuilder
OriginalL'auteur Nicolas Zozol
StringBuilder a été introduit dans Java 1.5, donc il ne fonctionne pas avec les anciennes machines virtuelles.
De la La documentation javadoc:
pas nécessairement - il y a des produits d'entreprises là-bas sur le pré 1.4 que la plupart d'entre nous utilisons tous les jours. Aussi BlackBerry java est basé sur la 1.4 et qui est encore très courant.
Et de la CDC et CLDC n'ont pas
StringBuilder
.OriginalL'auteur Marc Novakowski
Voici les différences que j'ai remarqué :
StringBuffer :-
StringBuilder:-
Chose commune :-
OriginalL'auteur Sireesh Yarlagadda
StringBuilder est pas thread-safe. Tampon de chaîne est. Plus d'infos ici.
EDIT: pour ce qui est de la performance , après hotspot coups de pied dans , StringBuilder est le gagnant. Cependant , pour les petites itérations , la différence de performances est négligeable.
OriginalL'auteur Learning
StringBuilder
etStringBuffer
sont presque les mêmes. La différence est queStringBuffer
est synchronisé etStringBuilder
ne l'est pas. Bien que,StringBuilder
est plus rapide queStringBuffer
, la différence de performance est très peu.StringBuilder
est un SOLEIL de remplacement deStringBuffer
. Il évite tout de synchronisation de toutes les méthodes publiques. Plutôt que cela, leur fonctionnement est le même.Exemple de bonne utilisation:
Si votre texte est en passe de changer, et est utilisé par plusieurs threads, il est préférable d'utiliser
StringBuffer
. Si votre texte est en passe de changer, mais il est utilisé par un seul thread, puis utilisezStringBuilder
.OriginalL'auteur subodh ray
StringBuffer
-
StringBuilder
StringBuilder
sans aucun autre changementappend
deux fois, ouappend
ettoString
n'est pas non plus sûr.OriginalL'auteur JRomio
StringBuffer
StringBuffer est mutable signifie que l'on peut modifier la valeur de l'objet . L'objet créé par StringBuffer est stocké dans le tas . StringBuffer a les mêmes méthodes que la classe StringBuilder , mais chaque méthode dans StringBuffer est synchronisé qui est StringBuffer est thread-safe .
de ce fait, il ne permet pas à deux threads d'accéder simultanément à la même méthode . Chaque méthode peut être accessible par un seul thread à la fois .
Mais être thread-safe a des inconvénients aussi que la performance de l'StringBuffer hits en raison de thread-safe de la propriété . Ainsi StringBuilder est plus rapide que le StringBuffer lors de l'appel aux mêmes méthodes de chaque classe.
StringBuffer valeur peut être modifiée , cela signifie qu'il peut être attribué à la nouvelle valeur . Aujourd'hui, ses plus commune de la question de l'entrevue ,les différences entre les classes ci-dessus .
Tampon de chaîne peut être converti en chaîne de caractères en utilisant
la méthode toString ().
StringBuilder
StringBuilder est le même que le StringBuffer , qu'en est-il des magasins de l'objet dans le tas et il peut également être modifié . La principale différence entre les StringBuffer et StringBuilder est que StringBuilder est pas thread-safe.
StringBuilder est rapide car il n'est pas thread-safe .
Ressource: String Vs StringBuffer Vs StringBuilder
Je ne serais pas d'accord que les Chaînes et StringBuilders sont "rapides" et StringBuffers sont "très lente". Voir les réponses ci-dessus.
OriginalL'auteur Virtual
String
est immuable.StringBuffer
est mutable et synchronisés.StringBuilder
aussi mutable mais ce n'est pas synchronisée.En outre StringBuffer serrures de Fils pour accéder à ce thread-safe données c'est pourquoi l'opération va lentement. StringBuilder n'a pas de blocage de fil et il fonctionne en Multi Threading sens, c'est pourquoi il est rapide. String - quand vous n'avez pas besoin de concaténer des string c'est le bon sens, mais quand vous en avez besoin d'utiliser StringBuilder -> parce que la Chaîne crée à chaque fois un nouvel Objet dans le tas, mais StringBuilder retour même objet...
OriginalL'auteur sudhakar
La javadoc explique la différence:
OriginalL'auteur skaffman
StringBuilder
(introduit dans Java 5) est identique àStringBuffer
, à l'exception de ses méthodes ne sont pas synchronisés. Cela signifie qu'il a de meilleures performances que le dernier, mais l'inconvénient est qu'il n'est pas thread-safe.Lire tutoriel pour plus de détails.
OriginalL'auteur Sébastien Le Callonnec
Un programme simple illustrant la différence entre StringBuffer et StringBuilder:
OriginalL'auteur Kevin Lee
Mieux utiliser StringBuilder, car il n'est pas synchronisé et donc de meilleures performances. StringBuilder est une baisse-dans le remplacement de l'ancienne StringBuffer.
vrai, mais la plupart du temps le
StringBu(ff|ild)er
est une variable locale utilisée que par un seul thread.Même dans une application multi-thread, on serait souvent utiliser le verrouillage externe, ou de faire du travail supplémentaire pour l'éviter. Par exemple, si deux threads chaque voulez ajouter un dossier contenant plusieurs cordes à un stringbuilder, ils auraient à agréger les données à ajouter, puis ajoutez-le comme une unité, même si il aurait été plus vite-absent problèmes de threading--de simplement effectuer une séquence de discrètes ajouter des opérations.
vrai dat.
OriginalL'auteur Niclas
StringBuffer
est synchronisé, maisStringBuilder
ne l'est pas. En conséquence,StringBuilder
est plus rapide queStringBuffer
.OriginalL'auteur Ahmad adawi
StringBuffer
est mutable. Il peut changer en termes de longueur et de contenu. StringBuffers sont thread-safe, ce qui signifie qu'ils ont synchronisé méthodes de contrôle de l'accès, de sorte qu'un seul thread peut accéder à un objet StringBuffer synchronisées de code à la fois. Ainsi, StringBuffer objets sont généralement sans danger pour une utilisation dans un environnement multi-threads où plusieurs threads peuvent être en train d'essayer d'accéder à la même StringBuffer objet en même temps.
StringBuilder
La classe StringBuilder est très similaire à StringBuffer, sauf que son accès n'est pas synchronisés, de sorte qu'il n'est pas thread-safe. En n'étant pas synchronisés, les performances de StringBuilder peut être mieux que StringBuffer. Ainsi, si vous travaillez dans un seul thread de l'environnement, à l'aide de StringBuilder au lieu de StringBuffer peut entraîner une augmentation des performances. C'est aussi vrai pour d'autres situations, comme un StringBuilder variable locale (c'est à dire, une variable à l'intérieur d'une méthode), où un seul thread va être accéder à un objet StringBuilder.
OriginalL'auteur Android Genius
StringBuffer:
StringBuilder
String c = a + b
est équivalent àString c = new StringBuilder().append(a).append(b).toString()
, de sorte qu'il n'est pas plus rapide. C'est seulement que vous en créer un nouveau pour chaque chaîne de l'assignation, alors que vous pourriez avoir qu'une seule (String d = a + b; d = d + c;
estString d = new StringBuilder().append(a).append(b).toString(); d = new StringBuilder().append(d).append(c).toString();
toutStringBuilder sb = new StringBuilder(); sb.append(a).append(b); sb.append(c); String d = sb.toString();
permettrait de sauver un StringBuilder instanciation).OriginalL'auteur Asif Mushtaq
Chaîne-Builder :
Chaîne-Tampon
Il est recommandé d'utiliser StringBuilder chaque fois que possible, car il est plus rapide que StringBuffer. Toutefois, si le fil de sécurité est nécessaire, la meilleure option est de StringBuffer objets.
OriginalL'auteur Avinash
StringBuffer est utilisé pour stocker des chaînes de caractères qui seront modifiées (objets String ne peut pas être changé). Il s'étend automatiquement au besoin. Classes associées: String, CharSequence.
StringBuilder a été ajoutée dans Java 5. Il est en tous points identique à StringBuffer sauf qu'il n'est pas synchronisée, ce qui signifie que si plusieurs threads accèdent à la même heure, il pourrait y avoir des problèmes. Single-threaded programmes, le cas le plus courant, en évitant la surcharge de synchronisation fait l'objet StringBuilder très légèrement plus rapide.
StringBuilder
s sont généralement locales à une méthode, où ils sont visibles qu'à un seul thread.OriginalL'auteur
Il n'y a pas de différences fondamentales entre StringBuilder et StringBuffer, seulement quelques différences existent entre eux. Dans StringBuffer les méthodes sont synchronisés. Cela signifie qu'à un moment, un seul thread peut fonctionner sur eux. Si il y a plus d'un thread alors le deuxième thread va avoir à attendre pour le premier à terminer et le troisième aura à attendre pour le premier et le second à la fin et ainsi de suite. Cela rend le processus très lent et donc le rendement en cas de StringBuffer est faible.
D'autre part StringBuilder est non synchronisés. Cela signifie qu'à un moment plusieurs threads peuvent fonctionner sur la même StrinBuilder objet en même temps. Cela rend le processus très rapide et donc le rendement de StringBuilder est élevé.
OriginalL'auteur Pratik Paul
Depuis
StringBuffer
est synchronisé, il a besoin de quelques efforts supplémentaires, donc basé sur perforamance, c'est un peu lente queStringBuilder
.OriginalL'auteur Shuhail Kadavath
String est un objet immuable qui signifie que la valeur ne peut pas être changé, où, comme StringBuffer est mutable.
Le StringBuffer est Synchronisé par conséquent thread-safe, où, comme StringBuilder est pas et adapté pour seulement mono-thread instances.
OriginalL'auteur Ketan Patel
La différence majeure est
StringBuffer
est synchronisé maisStringBuilder
ne l'est pas.Si vous avez besoin d'utiliser plus d'un fil , puis StringBuffer est recommandé.Mais, ainsi que par la vitesse d'exécutionStringBuilder
est plus rapide queStringBuffer
, parce que ses pas synchronisées .que voulez-vous dire? 🙂
Je veux dire que la plupart des utilisations de StringBuffer sont pas thread-safe comme ils le font de multiples appels sans synchronisation externe, faisant de la classe plutôt inutile.
ah c'est comme StringBuffer a toujours besoin d'un synchronisé de l'environnement.
OriginalL'auteur Java Developers Guide
Vérifier le fonctionnement interne de la synchronisation méthode append de
StringBuffer
et non synchronisée méthode append deStringBuilder
.StringBuffer:
StringBuilder:
Depuis append est
synchronized
,StringBuffer
a des performances par rapport àStrinbBuilder
dans le multi-threading scénario. Tant que vous n'êtes pas le partage de tampon entre plusieurs threads, utilisezStringBuilder
, qui est rapide en raison de l'absence desynchronized
dans ajouter méthodes.OriginalL'auteur Ravindra babu
Voici les tests de performance résultat pour Chaîne vs StringBuffer vs StringBuilder. Enfin, StringBuilder a remporté l'épreuve. Voir ci-dessous pour le code de test et résultat.
Code:
M'exécutez sur ideone
Résultat:
100000 itération pour l'ajout d'un texte unique
10000 itération pour l'ajout d'un texte unique
OriginalL'auteur Ganesa Vijayakumar
synchronisé.
OriginalL'auteur Praveen Kishor
De chaque méthode présente dans StringBuffer est Synchronisé.
donc à un moment, un seul thread est autorisé à fonctionner StringBuffer objet.
Il Augmente le temps d'attente d'un Thread et Crée des problèmes de Performances
pour surmonter ce problème SOLEIL de Personnes introduites StringBuilder dans la version 1.5.
OriginalL'auteur Srinivas