Maison >Java >javaDidacticiel >Vous devez comprendre String, StringBuilder, StringBuffer
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
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
String s = "abcd"; s = s + "fgh";
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
String str = “This is only a” + “simple” + “test”;
Ce code est équivalent àString str = “This is only a simple test”;
String str2 = "This is only a"; String str3 = "simple"; String str4 = "test"; String str1 = str2 +str3 + str4;
Ce code sera également traité selon le processus de l'exemple 1
. 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); }
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.
String str = "123"; String str1 = str + "456"; String str2 = new StringBuilder().append(str).append("def").toString();
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.
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"); }
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
String str1 = "123" + "456" + "789"; String str2 = new StringBuilder("123").append("456").append("789").toString();
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!