Heim  >  Artikel  >  Java  >  Analyse des Unterschieds zwischen StringBuffer und String in JAVA

Analyse des Unterschieds zwischen StringBuffer und String in JAVA

高洛峰
高洛峰Original
2017-01-22 09:36:141453Durchsuche

Ich habe gesehen, dass diese Erklärung gut ist, also habe ich sie übertragen

Es gibt drei Klassen in Java, die für Zeichenoperationen verantwortlich sind.

1.Character arbeitet mit einem einzelnen Zeichen,

2.String arbeitet mit einer Zeichenfolge, unveränderliche Klasse.

3.StringBuffer arbeitet auch mit einer Zeichenfolge und ist eine Variablenklasse.

String:
ist ein Objekt, kein primitiver Typ.
ist ein unveränderliches Objekt. Sobald es erstellt wurde, kann sein Wert nicht geändert werden.
Änderungen an vorhandenen String-Objekten sind alle neu Erstellen Sie ein neues Objekt und speichern Sie den neuen Wert darin.
String ist eine endgültige Klasse, das heißt, sie kann nicht vererbt werden.

StringBuffer:
ist ein veränderbares Objekt Objekt wird nicht wie String neu erstellt
Es kann nur über den Konstruktor erstellt werden,
StringBuffer sb = new StringBuffer();
Hinweis: Es kann nicht über das Zuweisungssymbol
sb bezahlt werden = "Willkommen hier!"; //Nachdem das Fehlerobjekt erstellt wurde, wird Speicherplatz im Speicher zugewiesen und zunächst ein Nullwert gespeichert. Wenn Sie StringBuffer einen Wert zuweisen, können Sie dessen append() verwenden. Methode.
sb.append("hello");

StringBuffer ist bei String-Verbindungsvorgängen effizienter als String:

String str = new String("welcome to");

str += "here"; Die Verarbeitungsschritte von
bestehen tatsächlich darin, einen StringBuffer zu erstellen, dann append() aufzurufen und schließlich
StringBuffer inSting();
umzuwandeln. Auf diese Weise wird die String-Verbindung hergestellt Operation ist Es gibt einige zusätzliche Operationen als StringBuffer, aber natürlich ist die Effizienz beeinträchtigt.

Und da das String-Objekt ein unveränderliches Objekt ist, wird bei jeder Operation von Sting ein neues Objekt zum Speichern neu erstellt der neue Wert.

Auf diese Weise ist das ursprüngliche Objekt nutzlos und wird im Müll gesammelt.

Sehen Sie sich den folgenden Code an:

Fügen Sie 5000 Mal wiederholt 26 englische Buchstaben hinzu 🎜>
Leider ist mein Computer kein Supercomputer und das Ergebnis, das ich erhalte, ist nicht unbedingt jedes Mal das gleiche, normalerweise etwa 46687.

Das sind 46 Sekunden.
        String tempstr = "abcdefghijklmnopqrstuvwxyz";
        int times = 5000;
        long lstart1 = System.currentTimeMillis();
        String str = "";
        for (int i = 0; i < times; i++) {
            str += tempstr;
        }
        long lend1 = System.currentTimeMillis();
        long time = (lend1 - lstart1);
        System.out.println(time);

Schauen wir uns den folgenden Code noch einmal an

Das Ergebnis ist 16 und manchmal 0
        String tempstr = "abcdefghijklmnopqrstuvwxyz";
        int times = 5000;
        long lstart2 = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < times; i++) {
            sb.append(tempstr);
        }
        long lend2 = System.currentTimeMillis();
        long time2 = (lend2 - lstart2);
        System.out.println(time2);
Die Schlussfolgerung liegt also auf der Hand: StringBuffer ist fast Zehntausende Mal schneller als String. Natürlich sind diese Daten nicht sehr genau. Denn bei einer Zyklenzahl von 100.000 ist der Unterschied noch größer. Wenn Sie mir nicht glauben, versuchen Sie es



Wenn Sie immer noch nicht verstehen:

1) Der Unterschied zwischen der Union +-Methode von String und dem Anhängen von StringBuff Methode:

Wenn der +-Operator von String String-Operationen ausführt, konvertiert er zunächst das aktuelle String-Objekt in den StringBuff-Typ, ruft seine Append-Methode auf und konvertiert schließlich das generierte StringBuff-Objekt über seine toString-Methode in einen String-Typ-String. Daher ist seine Effizienz geringer.

Aber im Hinblick auf die Lesbarkeit ist der Verbindungsoperator von String immer noch besser.

2) StringBuff ist Thread-sicher

String ist Thread-unsicher

3) String ist ein String-Objekt, das nicht geändert werden kann, aber StringBuff kann geändert werden.

Weitere Artikel zur Analyse des Unterschieds zwischen StringBuffer und String in JAVA finden Sie auf der chinesischen PHP-Website!
public static boolean fileCopy(String srcStr, String destStr) {
File srcFile = null;
File destFile = null;
Reader reader = null;
Writer writer = null;
boolean flag = false;
try {
srcFile = new File(srcStr);
if (!srcFile.exists()) {
System.out.println(“源文件不存在”);
System.exit(0);
} else {
reader = new FileReader(srcFile);
}
destFile = new File(destStr);
writer = new FileWriter(destFile);
char[] buff = new 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;
writer.flush();
reader.close();
writer.close();
} catch (IOException e) {
System.out.println(“文件拷贝异常:= ” + e.getMessage());
}
return flag;
}
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn