Maison > Java > javaDidacticiel > Vous devez comprendre String, StringBuilder, StringBuffer

Vous devez comprendre String, StringBuilder, StringBuffer

无忌哥哥
Libérer: 2018-07-20 09:37:07
original
1310 Les gens l'ont consulté

La relation et la différence entre les trois classes String, StringBuilder et StringBuffer a toujours été un problème classique en Java. Cette fois, je vais parler de quelques connaissances sur ces trois classes

Comparaison simple

.
  • String : Constante de caractère

  • StringBuilder : Variable de caractère

  • StringBuffer : Variable de caractère

String est un type constant et est déclaré comme classe finale. Toutes les propriétés sont également de type final, donc une fois l'objet String créé, il ne peut pas être modifié
StringBuilder / StringBuffer deux classes appartiennent à une variable ; les types peuvent être modifiés, ce sont toutes des classes fournies pour résoudre le problème du trop grand nombre d'objets intermédiaires produits par la concaténation de chaînes.

  • Vitesse d'exécution StringBuilder > StringBuffer > String

  • Sécurité du thread : StringBuffer

  • Non Sécurité des threads : StringBuilder

StringBuilder n'est pas très différent de StringBuffer en substance, mais comme StringBuilder supprime la partie sécurité des threads de StringBuffer, il réduit efficacement la surcharge. Par conséquent, StringBuilder est le premier choix pour les opérations d'épissage de chaînes dans la plupart des cas

2. Chaîne de traitement de chaîne

Exemple 1 :

String s = "abcd";
s = s + "fgh";
Copier après la connexion

Plusieurs les gens pensent à tort que le type String est variable lors d'un tel traitement de chaîne.

Mais en fait, le processus de traitement de ce code par JVM est le suivant : créez d'abord l'objet s, attribuez la valeur "abcd", puis lors du traitement de la deuxième ligne de code, créez un autre objet s, attribuez la valeur "abcdfgh", puis le premier objet est récupéré.

Cela équivaut donc à ce que le premier s soit inchangé et le second s soit un nouvel objet

Exemple 2 :

String str = “This is only a” + “simple” + “test”;
Copier après la connexion

Ce code est équivalent àString str = “This is only a simple test”;

Exemple 3 :

String str2 = "This is only a";
String str3 = "simple";
String str4 = "test";
String str1 = str2 +str3 + str4;
Copier après la connexion

Ce code sera également traité selon le processus de l'exemple 1

3 Caractéristiques de construction StringBuilder / StringBuffer

. Lors du processus de construction de ces deux objets, ils demandent d'abord un tableau de caractères (char[]) selon la taille par défaut. La capacité par défaut est de 16 caractères, mais si elle dépasse, Arrays.copyOf() sera utilisé pour doubler la taille. capacité à 16, 32, 64, 128..., bien sûr, cela affectera les performances, vous pouvez donc personnaliser sa capacité selon vos besoins lors de la création d'un objet

//默认 16 个字符
public StringBuilder() {
    super(16);
}
//构造函数定义容量
public StringBuilder(int capacity) {
    super(capacity);
}
Copier après la connexion

4. Comparaison de l'épissage de chaînes de traitement String et StringBuilder

Nous savons tous qu'il est recommandé d'utiliser StringBuilder lors de l'exécution d'opérations d'épissage de chaînes, mais est-il toujours recommandé d'utiliser StringBuilder au lieu de String pour l'épissage de chaînes ? Évidemment non.

Exemple 1 :

String str = "123";
String str1 = str + "456";
String str2 = new StringBuilder().append(str).append("def").toString();
Copier après la connexion

Dans ce cas, il y a peu de différence d'efficacité entre les deux méthodes de traitement

DansJDK 8 Dans , l'opération d'épissage de chaîne de String sera automatiquement convertie en StringBuilder par le compilateur et la méthode append sera appelée. En raison de ce schéma d'optimisation, l'efficacité de traitement des deux classes dans ce cas n'est pas très différente ; tandis que dans JDK 9, afin d'optimiser davantage l'opération de chaîne, StringConcatFactory est fourni, en tant qu'entrée unifiée, pour optimiser davantage l'opération d'épissage de chaîne.

Exemple 2 :

String str = "";
for (int i = 0; i < 1000; i++) {
    str += "12345";
}

StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    stringBuilder.append("12345");
}
Copier après la connexion

Dans ce cas, StringBuilder est plus rapide

Dans la boucle, à chaque fois que "+" est exécuté, Create un objet String, il y aura donc beaucoup de consommation de création et de recyclage d'objets.

Pour faire simple, dans la boucle pour effectuer un épissage de chaîne sur le même objet chaîne, StringBuilder

L'exemple 3 est préféré

String str1 = "123" + "456" + "789";

String str2 = new StringBuilder("123").append("456").append("789").toString();
Copier après la connexion

Dans ce cas, String est plus rapide

Nous savons tous que String str1 = "123" + "456" + "789"; est en fait équivalent à String str1 = "123456789";, mais StringBuilder doit appeler la méthode append plusieurs fois.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal