1734 votes

StringBuilder et StringBuffer en Java

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?

1776voto

sblundy Points 27163

StringBuffer est synchronisé, StringBuilder ne l'est pas.

761voto

polygenelubricants Points 136838

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.

267voto

OscarRyz Points 82553

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.

195voto

Bert F Points 27237

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 pour StringBuffer 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.

88voto

user1923551 Points 502

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X