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 de ces?
Réponses
Trop de publicités?StringBuffer
est synchronisé, StringBuilder
ne l'est pas.
StringBuilder
plus rapide que de l' StringBuffer
parce que c'est pas synchronized
.
Voici un simple test de référence:
public class Main {
public static void main(String[] args) {
int N = 77777777;
long t;
{
StringBuffer sb = new StringBuffer();
t = System.currentTimeMillis();
for (int i = N; i --> 0 ;) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
{
StringBuilder sb = new StringBuilder();
t = System.currentTimeMillis();
for (int i = N; i --> 0 ;) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
}
}
Un essai donne le nombre d' 2241 ms
pour StringBuffer
vs 753 ms
pour StringBuilder
.
Fondamentalement, StringBuffer méthodes sont synchronisés tout en StringBuilder 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:
Cette classe [StringBuilder] fournit une API compatible avec StringBuffer, mais sans aucune garantie de la synchronisation. Cette classe est conçu pour une utilisation en baisse-dans le remplacement pour StringBuffer dans des endroits où la chaîne de la mémoire tampon a été utilisé par un seul thread (comme c'est généralement le cas). Si possible, il est recommandé que cette classe sera utilisée de préférence à StringBuffer que ça sera plus rapide dans la plupart des implémentations.
Si elle a été faite pour le remplacer.
La même chose s'est produite avec le Vecteur et l'ArrayList.
Mais nécessaire pour obtenir la nette différence avec l'aide d'un exemple?
StringBuffer ou StringBuilder
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
qui 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
sont venus plus tard. La plupart des utilisations de l'StringBuffer
étaient mono-thread et paient le coût de la synchronisation.Depuis
StringBuilder
est une baisse-dans le remplacement pourStringBuffer
sans la synchronisation, il n'y aurait pas de différences entre les exemples.Si vous êtes en essayant de les 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.
D'abord, permet de voir les 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? StringBuider : 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.
Remarque : N'utilisez pas de StringBuffer inutilement. Les moyens, ne pas l'utiliser si un thread est en train de modifier et d'y accéder. Parce qu'il a beaucoup de verrouillage et de déverrouillage de code de synchronisation qui va de l'onu nécessairement prendre le temps CPU. Ne pas utiliser des verrous, sauf si cela est nécessaire.