In diesem Artikel werden hauptsächlich die detaillierten Erklärungen und Verwendungsbeispiele von String StringBuilder und StringBuffer in Java vorgestellt.
In der Android-/Java-Entwicklung wird es zum Verarbeiten von Zeichenfolgen verwendet drei häufig verwendete Klassen: String, StringBuilder und StringBuffer.
Ihre Gemeinsamkeiten und Unterschiede:
1) Sie sind beide Abschlussklassen und dürfen nicht vererbt werden;
2) Die Stringlänge ist unveränderlich , die Längen von StringBuffer und StringBuilder sind variabel;
3) StringBuffer ist threadsicher, StringBuilder ist jedoch nicht threadsicher.
String VS StringBuffer
Der Hauptleistungsunterschied zwischen String-Typ und StringBuffer: String ist ein unveränderliches Objekt, daher ändert sich der String-Typ jedes Mal. Es wird ein neues String-Objekt generiert, und der Zeiger zeigt auf das neue String-Objekt. Daher ist es am besten, String nicht für Zeichenfolgen zu verwenden, deren Inhalt sich häufig ändert, da dies jedes Mal Auswirkungen hat, wenn ein Objekt generiert wird Systemleistung, insbesondere wenn keine Referenzen im Speicher vorhanden sind, beginnt der GC der JVM zu arbeiten und die Leistung nimmt ab.
Bei Verwendung der StringBuffer-Klasse werden Operationen jedes Mal am StringBuffer-Objekt selbst ausgeführt, anstatt neue Objekte zu generieren und Objektreferenzen zu ändern. Daher wird in den meisten Fällen die Verwendung von StringBuffer empfohlen, insbesondere wenn sich String-Objekte häufig ändern.
In einigen Sonderfällen wird die String-Verkettung von String-Objekten tatsächlich vom Java-Compiler in die Verkettung von StringBuffer-Objekten kompiliert, sodass in diesen Fällen die Geschwindigkeit von String-Objekten nicht langsamer ist als die von StringBuffer-Objekten, zum Beispiel:
String s1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
Die Geschwindigkeit der Generierung von String s1-Objekten ist nicht langsamer als bei StringBuffer. Tatsächlich wird im Java Compiler die folgende Konvertierung automatisch durchgeführt:
Java Compiler kompiliert die erste Anweisung oben direkt in:
String s2 = “This is only a”; String s3 = “ simple”; String s4 = “ test”; String s1 = s2 + s3 + s4;
Zu diesem Zeitpunkt wird der Java-Compiler die Verkettungsoperation (d. h. +) von String über die Append-Methode von StringBuilder (oder StringBuffer) implementieren, wenn s2, s3 s4 verwendet die String-Definition. Sie müssen einen zusätzlichen StringBuffer (oder StringBuilder) erstellen. Wenn Sie StringBuffer (oder StringBuilder) verwenden, müssen Sie keinen zusätzlichen StringBuffer erstellen.
StringBuilder
StringBuilder ist neu in 5.0. Diese Klasse stellt eine StringBuffer-kompatible API bereit, garantiert jedoch keine Synchronisierung. Diese Klasse ist als Ersatz für StringBuffer konzipiert, wenn der String-Puffer von einem einzelnen Thread verwendet wird (was häufig vorkommt). Es wird empfohlen, nach Möglichkeit diese Klasse zu bevorzugen, da sie in den meisten Implementierungen schneller als StringBuffer ist. Die Methoden sind für beide grundsätzlich gleich.
Nutzungsstrategie
1) Grundprinzipien: Wenn Sie eine kleine Datenmenge verarbeiten möchten, verwenden Sie String, wenn Sie eine große Datenmenge verarbeiten möchten Wenn Sie einen einzelnen Thread verwenden möchten, verwenden Sie StringBuilder. Wenn Sie eine große Datenmenge mit einem einzelnen Thread verarbeiten möchten, verwenden Sie StringBuffer.
2) Verwenden Sie nicht das „+“ der String-Klasse, da die Leistung extrem schlecht ist. Dies ist ein wichtiger Punkt bei der Java-Optimierung . Prinzip. Zum Beispiel:
String result = ""; for (String s : hugeArray) { result = result + s; } // 使用StringBuilder StringBuilder sb = new StringBuilder(); for (String s : hugeArray) { sb.append(s); } String result = sb.toString();
Wenn die obige Situation auftritt, müssen wir natürlich jedes Mal die zweite Methode verwenden, weil die erste Methode Die Schleife erstellt ein String-Ergebnis, um das Ergebnis zu speichern, mit der Ausnahme, dass die beiden grundsätzlich gleich sind.
3) StringBuilder wird im Allgemeinen innerhalb von Methoden verwendet, um Funktionen abzuschließen, die „+“ ähneln, da es threadunsicher ist. Sie können es also nach Gebrauch wegwerfen. StringBuffer wird hauptsächlich in globalen Variablen verwendet.
4) Durch die Verwendung von StirngBuilder kann im Vergleich zur Verwendung von StringBuffer unter den gleichen Umständen nur eine Leistungsverbesserung von etwa 10 bis 15 % erzielt werden, es besteht jedoch das Risiko einer Multithreading-Unsicherheit. Bei der tatsächlichen modularen Programmierung kann der für ein bestimmtes Modul verantwortliche Programmierer möglicherweise nicht eindeutig beurteilen, ob das Modul in einer Multithread-Umgebung ausgeführt wird. Daher: Es sei denn, es wird festgestellt, dass der Engpass des Systems bei StringBuffer liegt Sie sind sicher, dass StringBuilder nur verwendet werden kann, wenn das Modul nicht im Multithread-Modus ausgeführt wird. Andernfalls wird StringBuffer weiterhin verwendet.
Das Obige ist eine detaillierte Einführung in die detaillierte Erklärung und Verwendungsbeispiele von String StringBuilder und StringBuffer in Java. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).