Voir cette explication est bonne, donc je vais le retourner
Il y a 3 classes en Java qui sont responsables des opérations de caractère.
1. Le caractère est une opération à caractère unique.
2.String fonctionne sur une chaîne de caractères, classe immuable.
3.StringBuffer est également une opération sur une chaîne de caractères et est une classe mutable.
Chaîne:
C'est un objet, pas un type primitif.
Il s'agit d'un objet immuable et une fois qu'il est créé, sa valeur ne peut pas être modifiée.
La modification des objets de chaîne existants consiste à recréer un nouvel objet et à enregistrer la nouvelle valeur.
String est une classe finale, c'est-à-dire qu'elle ne peut pas être héritée.
StringBuffer:
C'est un objet mutable.
Il ne peut être créé que par des constructeurs,
StringBuffer sb = new StringBuffer ();
Remarque: il ne peut pas être payé par des symboles d'affectation.
sb = "Bienvenue à ici!"; // erreur
Une fois l'objet créé, l'espace mémoire sera alloué en mémoire et un NULL sera initialement enregistré.
SB.APPEND ("Hello");
L'efficacité de StringBuffer est supérieure à celle de la chaîne dans la concaténation des chaînes:
String str = new String ("Welcome To");
str + = "ici";
L'étape de traitement est en fait en créant un stringbuffer, puis en appelant A SPEnd (), et enfin
Puis ajoutez StringBuffer tosting ();
De cette façon, l'opération de connexion à chaîne aura des opérations supplémentaires que StringBuffer, et bien sûr, l'efficacité sera réduite.
Et comme l'objet String est un objet immuable, chaque opération de Sting recréera un nouvel objet pour enregistrer la nouvelle valeur.
De cette façon, l'objet d'origine sera inutile et sera collecté aux ordures.
Jetez un œil au code suivant:
Répétez 26 lettres anglaises 5 000 fois.
La copie de code est la suivante:
String tempmpstr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
INT TIMES = 5000;
long lStart1 = System.currentTimemillis ();
String str = "";
pour (int i = 0; i <fois; i ++) {
str + = temptr;
}
Long Lend1 = System.Currenttimemillis ();
long temps = (LAND1 - LSTART1);
System.out.println (temps);
Malheureusement, mon ordinateur n'est pas un supercalculateur, et les résultats que j'obtiens ne sont pas nécessairement les mêmes à chaque fois, généralement vers 46687.
C'est 46 secondes.
Jetons un coup d'œil au code suivant
La copie de code est la suivante:
String tempmpstr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
INT TIMES = 5000;
long lStart2 = System.currentTimeMillis ();
StringBuffer sb = new StringBuffer ();
pour (int i = 0; i <fois; i ++) {
SB.APPEND (TEMPSTR);
}
Long Lend2 = System.CurrentTimeMillis ();
Long Time2 = (LAND2 - LSTART2);
System.out.println (Time2);
Le résultat est 16 et parfois il est 0
La conclusion est donc évidente, la vitesse de StringBuffer est presque des dizaines de milliers de fois celle de la chaîne. Bien sûr, ces données ne sont pas très précises. Parce que le nombre de cycles est de 100 000 fois, la différence est encore plus grande. Si tu ne me crois pas, essayez
Si vous ne pouvez toujours pas comprendre:
1) La différence entre la méthode Joint + de la chaîne et la méthode d'ajout de StringBuff:
Lorsque l'opérateur String + effectue l'opération String, il convertit d'abord l'objet String actuel en type StringBuff, appelle sa méthode d'ajout et convertit enfin l'objet StringBuff généré en une chaîne de type String via sa méthode TOSTRING, donc il est inefficace.
Cependant, en termes de lisibilité, l'opérateur de connexion de String est toujours élevé.
2) StringBuff est file
La chaîne n'est pas sécurisée pour les fils
3) La chaîne est un objet String qui ne peut pas être modifié, tandis que StringBuff est modifié.
La copie de code est la suivante:
FileCopy booléen statique publique (String Srcstr, String deststr) {
Fichier srcfile = null;
Fichier destfile = null;
Lecteur lecteur = null;
Écrivain écrivain = null;
booléen drapeau = false;
essayer {
srcfile = nouveau fichier (srcstr);
if (! srcfile.exists ()) {
System.out.println ("Le fichier source n'existe pas");
System.exit (0);
} autre {
Reader = nouveau FileReader (Srcfile);
}
destfile = nouveau fichier (deststr);
écrivain = new FileWriter (destFile);
char [] buff = nouveau char [1024];
int len;
String str = "";
StringBuffer sbuff = new StringBuffer ();
while ((len = reader.read (buff))! = -1) {
// str + = new String (buff, 0, len);
sbuff.append (new String (buff, 0, len));
}
// writer.write (str.tocharArray ());
writer.write (sbuff.toString (). toCharArray ());
Flag = true;
écrivain.flush ();
Reader.Close ();
écrivain.close ();
} catch (ioexception e) {
System.out.println ("Exception de copie de fichier: =" + e.getMessage ());
}
drapeau de retour;
}