Heim  >  Artikel  >  Java  >  Unterscheiden Sie die String-Klassen String, StringBuffer und StringBuilder in Java

Unterscheiden Sie die String-Klassen String, StringBuffer und StringBuilder in Java

高洛峰
高洛峰Original
2017-01-22 10:06:481393Durchsuche

1 String
String: String-Konstante, die Länge des Strings ist unveränderlich.

2 StringBuffer
StringBuffer: String-Variable (synchronisiert, also threadsicher). Wenn Sie den String-Inhalt häufig ändern möchten, ist es aus Effizienzgründen am besten, StringBuffer zu verwenden. Wenn Sie ihn in den String-Typ konvertieren möchten, können Sie die toString()-Methode von StringBuffer aufrufen.
Java.lang.StringBuffer threadsichere veränderbare Zeichenfolge. Es enthält zu jedem Zeitpunkt eine bestimmte Zeichenfolge, die Länge und der Inhalt dieser Zeichenfolge können jedoch durch bestimmte Methodenaufrufe geändert werden. String-Puffer können sicher von mehreren Threads verwendet werden.
Die Hauptoperationen auf StringBuffer sind die Append- und Insert-Methoden, die überladen werden können, um jede Art von Daten zu akzeptieren. Jede Methode wandelt spezifizierte Daten effektiv in eine Zeichenfolge um und hängt dann die Zeichen dieser Zeichenfolge an einen Zeichenfolgenpuffer an oder fügt sie ein. Die Append-Methode fügt diese Zeichen immer am Ende des Puffers hinzu; die Insert-Methode fügt Zeichen an einer angegebenen Stelle hinzu. Wenn sich z beispielsweise auf ein Zeichenfolgenpufferobjekt bezieht, dessen aktueller Inhalt „start“ ist, führt dieser Methodenaufruf z.append(„le“) dazu, dass der Zeichenfolgenpuffer „startle“ enthält, während z.insert(4, „ le“) ändert den String-Puffer so, dass er „starlet“ enthält.

3 StringBuilder
StringBuilder: String-Variable (nicht threadsicher).
java.lang.StringBuilder ist eine variable Zeichenfolge, die in JDK5.0 neu ist. 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.
In den meisten Fällen StringBuilder > StringBuffer.

4 Unterschiede zwischen den drei
Der Hauptleistungsunterschied zwischen dem String-Typ und StringBuffer: String ist ein unveränderliches Objekt. Daher wird jedes Mal, wenn der String-Typ geändert wird, ein neues String-Objekt generiert Zeigen Sie mit dem Zeiger auf ein neues String-Objekt. Daher ist es am besten, String nicht für Zeichenfolgen zu verwenden, deren Inhalt sich häufig ändert, da dies Auswirkungen auf die Systemleistung hat, insbesondere wenn zu viele nicht referenzierte Objekte vorhanden sind Der Speicher, der GC der JVM, nimmt ab, sobald er zu arbeiten beginnt.
Bei Verwendung der StringBuffer-Klasse werden jedes Mal Operationen 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 von der JVM tatsächlich als die Verkettung von StringBuffer-Objekten interpretiert, 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 die von StringBuffer. Tatsächlich wird in der JVM die folgende Konvertierung automatisch durchgeführt:

String S1 = “This is only a” + “ simple” + “test”;

Die JVM behandelt die obige Anweisung direkt als:

String S1 = “This is only a simple test”;

Also sehr schnell. Es ist jedoch zu beachten, dass die JVM die verkettete Zeichenfolge nicht automatisch konvertiert, wenn sie von einem anderen String-Objekt stammt, und die Geschwindigkeit nicht so hoch ist, zum Beispiel:

String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;

Zu diesem Zeitpunkt wird die JVM dies auf die ursprüngliche Weise tun.
In den meisten Fällen StringBuffer > String.

Es gibt fast keinen Unterschied zwischen StringBuffer und StringBuilder
Sie rufen grundsätzlich verschiedene Methoden der übergeordneten Klasse auf, und die meisten internen Methoden sind es Wenn das Schlüsselwort „synced“ vorangestellt ist, verbraucht dies eine gewisse Leistung. StringBuilder ist nicht threadsicher und daher effizienter.

public static void main(String[] args) throws Exception {
    String string = "0";
    int n = 10000;
    long begin = System.currentTimeMillis();
    for (int i = 1; i < n; i++) {
      string += i;
    }
    long end = System.currentTimeMillis();
    long between = end - begin;
    System.out.println("使用String类耗时:" + between+"ms");
  
    int n1 = 10000;
    StringBuffer sb = new StringBuffer("0");
    long begin1 = System.currentTimeMillis();
    for (int j = 1; j < n1; j++) {
      sb.append(j);
    }
    long end1 = System.currentTimeMillis();
    long between1 = end1 - begin1;
    System.out.println("使用StringBuffer类耗时:" + between1+"ms");
  
    int n2 = 10000;
    StringBuilder sb2 = new StringBuilder("0");
    long begin2 = System.currentTimeMillis();
    for (int k = 1; k < n2; k++) {
      sb2.append(k);
    }
    long end2 = System.currentTimeMillis();
    long between2 = end2 - begin2;
    System.out.println("使用StringBuilder类耗时:" + between2+"ms");
  }

Ausgabe:

使用String类耗时:982ms
使用StringBuffer类耗时:2ms
使用StringBuilder类耗时:1ms

Obwohl diese Zahl bei jeder Ausführung anders ist, und Die Situation jeder Maschine ist unterschiedlich, aber einige Punkte sind sicher. Die String-Klasse verbraucht deutlich mehr als die anderen beiden. Ein weiterer Punkt ist, dass StringBuffer mehr verbraucht als StringBuilder, obwohl der Unterschied nicht offensichtlich ist.


5 Nutzungsstrategie
(1) Grundprinzipien: Wenn Sie eine kleine Datenmenge verarbeiten möchten, verwenden Sie String. Wenn Sie eine große Datenmenge mit einem einzelnen Thread verarbeiten möchten, verwenden Sie StringBuilder. Wenn Sie eine große Datenmenge mit einem Multithread verarbeiten möchten, verwenden Sie StringBuffer.
(2) Verwenden Sie nicht das „+“ der String-Klasse, da die Leistung extrem schlecht ist. Dies ist ein wichtiges Prinzip bei der Java-Optimierung. Beispiel: Wenn Sie String verwenden, erstellen Sie beim Zusammenfügen von Zeichenfolgen ein temporäres StringBuffer-Objekt auf der JVM. Um zwei Zeichenfolgen zu verbinden, müssen insgesamt 4 Objekte erstellt werden . Objekt! (Ein String zum Speichern des Ergebnisses, zwei String-Objekte und ein temporäres StringBuffer-Objekt). Wenn Sie StringBuffer verwenden, müssen Sie nur 2 Objekte erstellen! Ein StringBuffer-Objekt und das String-Objekt, das das Endergebnis enthält.
(3) Um eine bessere Leistung zu erzielen, sollte die Kapazität von StirngBuffer oder StirngBuilder beim Erstellen so weit wie möglich angegeben werden. Dies ist natürlich nicht erforderlich, wenn die Länge der von Ihnen bearbeiteten Zeichenfolge 16 Zeichen nicht überschreitet. Wenn Sie die Kapazität nicht angeben, kann dies die Leistung erheblich beeinträchtigen.
(4) StringBuilder wird im Allgemeinen innerhalb von Methoden verwendet, um Funktionen ähnlich wie „+“ auszuführen. Da es threadunsicher ist, kann es nach der Verwendung verworfen werden. StringBuffer wird hauptsächlich in globalen Variablen verwendet.
(5) 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.

Weitere Artikel zur Analyse der String-Klassen String, StringBuffer und StringBuilder in Java finden Sie auf der chinesischen PHP-Website!

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