Maison >Java >javaDidacticiel >Distinguer les classes de chaînes String, StringBuffer et StringBuilder en Java

Distinguer les classes de chaînes String, StringBuffer et StringBuilder en Java

高洛峰
高洛峰original
2017-01-22 10:06:481489parcourir

1 String
String : Chaîne constante, la longueur de la chaîne est immuable.

2 StringBuffer
StringBuffer : variable de chaîne (synchronisée, c'est-à-dire thread-safe). Si vous souhaitez modifier fréquemment le contenu de la chaîne, il est préférable d'utiliser StringBuffer pour des raisons d'efficacité. Si vous souhaitez le convertir en type String, vous pouvez appeler la méthode toString() de StringBuffer.
Séquence de caractères mutables thread-safe Java.lang.StringBuffer. À tout moment, il contient une séquence spécifique de caractères, mais la longueur et le contenu de cette séquence peuvent être modifiés via certains appels de méthode. Les tampons de chaînes peuvent être utilisés en toute sécurité par plusieurs threads.
Les principales opérations sur StringBuffer sont les méthodes append et insert, qui peuvent être surchargées pour accepter tout type de données. Chaque méthode convertit efficacement les données spécifiées en chaîne, puis ajoute ou insère les caractères de cette chaîne dans un tampon de chaîne. La méthode append ajoute toujours ces caractères à la fin du tampon ; la méthode insert ajoute les caractères à un point spécifié. Par exemple, si z fait référence à un objet tampon de chaîne dont le contenu actuel est "start", alors cet appel de méthode z.append("le") fera que le tampon de chaîne contiendra "startle", tandis que z.insert(4, " le") changera le tampon de chaîne pour qu'il contienne "starlet".

3 StringBuilder
StringBuilder : variable de chaîne (non thread-safe).
java.lang.StringBuilder est une séquence de caractères variable, qui est nouvelle dans JDK5.0. Cette classe fournit une API compatible StringBuffer mais ne garantit pas la synchronisation. Cette classe est conçue pour remplacer StringBuffer lorsque le tampon de chaîne est utilisé par un seul thread (ce qui est une situation courante). Il est recommandé de préférer cette classe si possible, car elle est plus rapide que StringBuffer dans la plupart des implémentations. Les méthodes pour les deux sont fondamentalement les mêmes.
Dans la plupart des cas, StringBuilder > StringBuffer.

4 Différences entre les trois
La principale différence de performances entre le type String et StringBuffer : String est un objet immuable, donc chaque fois que le type String est modifié, un nouvel objet String sera généré, puis Pointez le pointeur vers un nouvel objet String, il est donc préférable de ne pas utiliser String pour les chaînes dont le contenu change fréquemment, car chaque fois qu'un objet est généré, cela aura un impact sur les performances du système, en particulier lorsqu'il y a trop d'objets non référencés. la mémoire, le GC de la JVM le fera. Dès qu'il commencera à fonctionner, les performances se dégraderont.
Lors de l'utilisation de la classe StringBuffer, les opérations sont effectuées sur l'objet StringBuffer lui-même à chaque fois au lieu de générer de nouveaux objets et de modifier les références d'objet. Par conséquent, il est recommandé d'utiliser StringBuffer dans la plupart des cas, en particulier lorsque les objets chaîne changent fréquemment.
Dans certains cas particuliers, la concaténation de chaînes d'objets String est en fait interprétée par la JVM comme la concaténation d'objets StringBuffer, donc dans ces cas, la vitesse des objets String ne sera pas plus lente que celle des objets StringBuffer, par exemple :

String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

La vitesse de génération des objets String S1 n'est pas plus lente que StringBuffer. En fait, dans la JVM, la conversion suivante est automatiquement effectuée :

String S1 = “This is only a” + “ simple” + “test”;

La JVM traite directement l'instruction ci-dessus comme :

String S1 = “This is only a simple test”;

Donc Très vite. Mais il faut noter que si la chaîne concaténée provient d'un autre objet String, la JVM ne la convertira pas automatiquement, et la vitesse ne sera pas si rapide, par exemple :

String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;

À ce stade, la JVM le fera de la manière originale.
Dans la plupart des cas, StringBuffer > String.

4. Il n'y a presque aucune différence entre StringBuffer et StringBuilder
Ils appellent essentiellement diverses méthodes de la classe parent. Une différence importante est que StringBuffer est thread-safe et la plupart des méthodes internes le sont. précédé de Keyword synchronisé, cela consommera une certaine quantité de performances. StringBuilder n'est pas thread-safe, il est donc plus efficace.

public static void main(String[] args) throws Exception {
    String string = "0";
    int n = 10000;
    long begin = System.currentTimeMillis();
    for (int i = 1; i < n; i++) {
      string += i;
    }
    long end = System.currentTimeMillis();
    long between = end - begin;
    System.out.println("使用String类耗时:" + between+"ms");
  
    int n1 = 10000;
    StringBuffer sb = new StringBuffer("0");
    long begin1 = System.currentTimeMillis();
    for (int j = 1; j < n1; j++) {
      sb.append(j);
    }
    long end1 = System.currentTimeMillis();
    long between1 = end1 - begin1;
    System.out.println("使用StringBuffer类耗时:" + between1+"ms");
  
    int n2 = 10000;
    StringBuilder sb2 = new StringBuilder("0");
    long begin2 = System.currentTimeMillis();
    for (int k = 1; k < n2; k++) {
      sb2.append(k);
    }
    long end2 = System.currentTimeMillis();
    long between2 = end2 - begin2;
    System.out.println("使用StringBuilder类耗时:" + between2+"ms");
  }

Sortie :

使用String类耗时:982ms
使用StringBuffer类耗时:2ms
使用StringBuilder类耗时:1ms

Bien que ce numéro soit différent à chaque exécution, et each La situation de chaque machine est différente, mais quelques points sont certains. La classe String consomme beaucoup plus que les deux autres. Un autre point est que StringBuffer consomme plus que StringBuilder, même si la différence n'est pas évidente.


5 Stratégie d'utilisation
(1) Principes de base : Si vous souhaitez exploiter une petite quantité de données, utilisez String ; si vous souhaitez exploiter une grande quantité de données avec un seul thread, utilisez StringBuilder ; si vous souhaitez exploiter une grande quantité de données avec un multi-thread, utilisez StringBuffer.
(2) N'utilisez pas le " " de la classe String pour des épissages fréquents, car les performances sont extrêmement médiocres. Vous devez utiliser la classe StringBuffer ou StringBuilder. C'est un principe important dans l'optimisation Java. Par exemple : lorsque vous utilisez String, utilisez " " pour former un objet StringBuffer temporaire sur la JVM lors de l'épissage de chaînes, et en même temps créez un objet sur chaque chaîne. Pour épisser deux chaînes, un total de 4 objets doivent être créés. ! (Une chaîne pour enregistrer le résultat, deux objets chaîne et un objet StringBuffer temporaire). Lorsque vous utilisez StringBuffer, il vous suffit de créer 2 objets ! Un objet StringBuffer et l'objet String qui contient le résultat final.
(3) Afin d'obtenir de meilleures performances, la capacité de StirngBuffer ou StirngBuilder doit être spécifiée autant que possible lors de sa construction. Bien entendu, cela n’est pas nécessaire si la longueur de la chaîne que vous utilisez ne dépasse pas 16 caractères. Ne pas spécifier la capacité peut réduire considérablement les performances.
(4) StringBuilder est généralement utilisé dans des méthodes pour exécuter des fonctions similaires à " " Comme il n'est pas sécurisé pour les threads, il peut être supprimé après utilisation. StringBuffer est principalement utilisé dans les variables globales.
(5) L'utilisation de StirngBuilder ne peut obtenir qu'une amélioration des performances d'environ 10 % à 15 % par rapport à l'utilisation de StringBuffer dans les mêmes circonstances, mais cela entraînera un risque d'insécurité multithread. Dans la programmation modulaire réelle, le programmeur responsable d'un certain module n'est pas nécessairement en mesure de juger clairement si le module sera exécuté dans un environnement multithread. Par conséquent : à moins qu'il ne soit déterminé que le goulot d'étranglement du système est sur StringBuffer, et. vous êtes sûr que StringBuilder ne peut être utilisé que si le module ne s'exécute pas en mode multithread ; sinon, StringBuffer est toujours utilisé ;

Pour plus d'articles sur l'analyse des classes de chaînes String, StringBuffer et StringBuilder en Java, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn