1 corde
String: String Constante, la longueur de 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 convertir en type de chaîne, vous pouvez appeler la méthode ToString () de StringBuffer.
Java.lang.StringBuffer séquence de caractères mutable en filetage. Il contient une certaine séquence de caractères à tout moment, mais la longueur et le contenu de la séquence peuvent être modifiés par certains appels de méthode. Les tampons de chaîne peuvent être utilisés en toute sécurité pour plusieurs threads.
Les principales opérations sur StringBuffer sont les méthodes d'ajout et d'insertion, qui peuvent être surchargées pour accepter tout type de données. Chaque méthode peut convertir efficacement les données spécifiées en une chaîne, puis ajouter ou insérer les caractères de la chaîne en tampon de chaîne. La méthode d'ajout ajoute toujours ces caractères à la fin du tampon; La méthode d'insert ajoute des caractères au point spécifié. Par exemple, si Z fait référence à un objet de tampon de chaîne dont le contenu actuel est "Démarrer", cet appel de méthode z.append ("le") fait que le tampon de chaîne contenait "Commerce", et z.insert (4, "le") modifie le tampon de chaîne pour contenir "Starlet".
3 StringBuilder
StringBuilder: Variable String (SAFE SAFE SAFE).
java.lang.stringBuilder est une séquence de caractères variable qui est nouvellement ajoutée à JDK5.0. Cette classe fournit une API compatible StringBuffer, mais n'est pas garantie d'être synchronisée. Cette classe est conçue pour être un simple remplacement pour StringBuffer, lorsque des tampons de chaîne sont utilisés par un seul thread (c'est courant). Si possible, il est recommandé de suivre ce cours en premier, car dans la plupart des implémentations, il est plus rapide que StringBuffer. Les méthodes des deux sont fondamentalement les mêmes.
Dans la plupart des cas, StringBuilder> StringBuffer.
4 La différence entre les trois
La différence de performance principale entre le type de chaîne et StringBuffer: String est un objet immuable. Par conséquent, chaque fois que le type de chaîne est modifié, un nouvel objet de chaîne sera généré, puis le pointeur sera indiqué vers un nouvel objet String. Par conséquent, il est préférable de ne pas utiliser de chaîne pour des chaînes qui changent souvent de contenu, car chaque fois que l'objet est généré, il aura un impact sur les performances du système, en particulier lorsqu'il y a trop d'objets référencés en mémoire, le GC du JVM commencera à fonctionner et que les performances seront dégradées.
Lorsque vous utilisez la classe StringBuffer, l'objet StringBuffer lui-même est fonctionné à chaque fois au lieu de générer un nouvel objet et de modifier la référence d'objet. Par conséquent, dans la plupart des cas, StringBuffer est recommandé, en particulier lorsque les objets de chaîne sont souvent modifiés.
Dans certains cas particuliers, l'épissage de chaîne de l'objet String est en fait interprété par le JVM comme une épissage de l'objet StringBuffer, de sorte que la vitesse de l'objet String n'est pas plus lente que l'objet StringBuffer à ces moments, par exemple:
String S1 = "Ceci n'est qu'un" + "simple" + "test"; StringBuffer sb = new StringBuilder ("Ceci est seulement un"). APPEND ("Simple"). APPEND ("test"); Générer des objets S1 String n'est pas plus lent que StringBuffer. En fait, dans le JVM, la conversion suivante est automatiquement effectuée:
String S1 = "Ceci n'est qu'un" + "simple" + "test";
Le JVM traite directement la déclaration ci-dessus comme:
String S1 = «Ce n'est qu'un simple test»;
La vitesse est donc très rapide. Mais il convient de noter que si la chaîne épissée provient d'un autre objet de chaîne, le JVM ne se convertira pas automatiquement et que la vitesse ne sera pas si rapide, par exemple:
String S2 = "Ceci est seulement un"; String S3 = "Simple"; String S4 = "Test"; String S1 = S2 + S3 + S4;
À l'heure actuelle, le JVM le fera régulièrement de la manière originale.
Dans la plupart des cas, StringBuffer> String.
4.StringBuffer et StringBuilder
Il n'y a presque pas de différence entre les deux. Ils appellent essentiellement diverses méthodes de la classe parent. Une différence importante est que StringBuffer est enfile. La plupart des méthodes internes ont le mot-clé synchronisé avant lui, ce qui entraînera une certaine consommation de performances. StringBuilder est sans thread-sate, il est donc plus efficace.
public static void main (String [] args) lève l'exception {String String = "0"; int n = 10000; long début = System.CurrentTimemillis (); pour (int i = 1; i <n; i ++) {String + = i; } long fin = System.currentTimemillis (); Long entre = fin - commencer; System.out.println ("Time consommé en utilisant la classe de chaîne:" + entre + "MS"); int n1 = 10000; StringBuffer sb = new StringBuffer ("0"); long début1 = System.currentTimemillis (); pour (int j = 1; j <n1; j ++) {sb.append (j); } long end1 = System.currenttimemillis (); long entre1 = end1 - begin1; System.out.println ("Temps consommé à l'aide de la classe StringBuffer:" + Entre1 + "MS"); int n2 = 10000; StringBuilder sb2 = new StringBuilder ("0"); long début2 = System.currentTimemillis (); pour (int k = 1; k <n2; k ++) {sb2.append (k); } long end2 = System.currenttimemillis (); long entre2 = end2 - begin2; System.out.println ("Le temps qui prend du temps pour utiliser StringBuilder Class:" + Entre2 + "MS"); } Sortir:
Temps pour utiliser la classe String: 982ms Temps pour utiliser StringBuffer Class: 2ms Temps pour utiliser StringBuilder Classe: 1ms
Bien que ce nombre soit différent à chaque fois et que la situation de chaque machine soit différente, il y a plusieurs points qui sont certains et la classe de chaînes consomme beaucoup plus que les deux autres. Un autre point est que StringBuffer consomme plus que StringBuilder, bien que la différence ne soit pas évidente.
5 stratégies d'utilisation
(1) Principes de base: si vous souhaitez utiliser une petite quantité de données, utilisez une chaîne; Si vous utilisez une grande quantité de données avec un seul thread, utilisez StringBuilder; Si vous utilisez une grande quantité de données avec un multi-thread, utilisez StringBuffer.
(2) N'utilisez pas le "+" de la classe String pour l'épissage fréquent, car si les performances sont extrêmement médiocres, vous devez utiliser la classe StringBuffer ou StringBuilder, qui est un principe relativement important dans l'optimisation de Java. Par exemple: lors de l'utilisation de la chaîne, lors de l'épissage des chaînes, utilisez "+" pour former un objet StringBuffer temporaire sur le JVM, et en même temps, un objet est créé sur chaque chaîne. Après avoir épissé deux cordes, un total de 4 objets doivent être créés! (Une chaîne qui maintient le résultat, deux objets de chaîne et un objet StringBuffer temporaire). Si vous utilisez StringBuffer, il vous suffit de créer 2 objets! Un objet StringBuffer et un objet String qui maintient le dernier résultat.
(3) Pour de meilleures performances, leur capacité doit être spécifiée autant que possible lors de la construction de Stirngbuffer ou Stirngbuilder. Bien sûr, si la chaîne que vous utilisez ne dépasse pas 16 caractères, vous n'en aurez pas besoin. Ne pas spécifier la capacité réduira considérablement les performances.
(4) StringBuilder est généralement utilisé à l'intérieur de la méthode pour remplir des fonctions "+" similaires. Parce que ? Est-ce que la file d'attente, il peut être jeté après une utilisation. StringBuffer est principalement utilisé dans les variables globales.
(5) L'utilisation de StirngBuilder dans la même situation ne peut qu'une amélioration des performances d'environ 10% ~ 15% par rapport à l'utilisation de StringBuffer, mais il prend le risque de non-sécurisation multi-thread. Dans la programmation modulaire réelle, le programmeur responsable d'un certain module peut ne pas être en mesure de déterminer clairement si le module sera placé dans un environnement multi-thread. Par conséquent, StringBuilder ne peut être utilisé qu'à moins que vous soyez sûr que le goulot d'étranglement du système est sur le StringBuffer et que vous êtes sûr que votre module ne s'exécutera pas en mode multithread; Sinon, StringBuffer est toujours utilisé.