1 String
Zeichenfolge: Stringkonstante, Stringlänge ist unveränderlich.
2 StringBuffer
StringBuffer: String-Variable (synchronisiert, d. H. Thread-Safe). Wenn Sie den String -Inhalt häufig ändern möchten, verwenden Sie StringBuffer am besten aus Effizienzgründen. Wenn Sie in den String -Typ konvertieren möchten, können Sie die Methode von StringBuffer's ToString () aufrufen.
Java.lang.StringBuffer-Thread-safe mutable Zeichensequenz. Es enthält eine bestimmte Reihenfolge von Zeichen zu jedem Zeitpunkt, aber die Länge und der Inhalt der Sequenz können durch einige Methodenaufrufe geändert werden. Stringpuffer können sicher für mehrere Threads verwendet werden.
Die Hauptvorgänge auf StringBuffer sind die Anhang- und Einfügungsmethoden, die überladen werden können, um alle Datenart zu akzeptieren. Jede Methode kann die angegebenen Daten effektiv in eine Zeichenfolge umwandeln und dann die Zeichen der Zeichenfolge in den String -Puffer anhängen oder einfügen. Die Anhangsmethode fügt diese Zeichen immer zum Ende des Puffers hinzu. Die Methode Einfügen fügt Zeichen am angegebenen Punkt hinzu. Wenn sich Z auf ein String -Puffer -Objekt bezieht, dessen aktueller Inhalt "Start" ist, ruft diese Methode Z.Append ("LE") den String -Puffer "erschreckend" auf, und Z.Insert (4, "LE") ändert den String -Puffer in "Stern".
3 StringBuilder
StringBuilder: String-Variable (nicht thread sicher).
Java.lang.StringBuilder ist eine variable Zeichensequenz, die zu JDK5.0 neu hinzugefügt wird. Diese Klasse bietet eine StringBuffer-kompatible API, ist jedoch nicht garantiert synchronisiert. Diese Klasse ist als einfacher Ersatz für StringBuffer ausgelegt, wenn String -Puffer von einem einzelnen Thread verwendet werden (dies ist üblich). Wenn möglich, wird empfohlen, diese Klasse zuerst zu nehmen, da sie in den meisten Implementierungen schneller als StringBuffer ist. Die Methoden von beiden sind im Grunde gleich.
In den meisten Fällen StringBuilder> StringBuffer.
4 Der Unterschied zwischen den drei
Der Hauptdifferenz zwischen String und StringBuffer: String ist ein unveränderliches Objekt. Daher wird jedes Mal, wenn der String -Typ geändert wird, ein neues String -Objekt generiert, und dann wird der Zeiger auf ein neues String -Objekt hingewiesen. Daher ist es am besten, String für Zeichenfolgen zu verwenden, die häufig den Inhalt ändern. Jedes Mal, wenn das Objekt generiert wird, wirkt sich dies auf die Systemleistung aus.
Bei Verwendung der StringBuffer -Klasse wird das StringBuffer -Objekt selbst jedes Mal betrieben, anstatt ein neues Objekt zu generieren und die Objektreferenz zu ändern. Daher wird in den meisten Fällen StringBuffer empfohlen, insbesondere wenn String -Objekte häufig geändert werden.
In einigen speziellen Fällen wird das String -Spleißen des String -Objekts tatsächlich von der JVM als Spleißen des StringBuffer -Objekts interpretiert, sodass die Geschwindigkeit des String -Objekts nicht langsamer ist als das StringBuffer -Objekt zu diesen Zeiten, z. B.:
String S1 = "Dies ist nur ein" + "einfach" + "Test"; StringBuffer sb = new StringBuilder ("Dies ist nur ein"). Append ("einfach"). Append ("test"); Das Generieren von String S1 -Objekten ist nicht langsamer als StringBuffer. Tatsächlich wird im JVM die folgende Konvertierung automatisch durchgeführt:
String S1 = "Dies ist nur ein" + "einfach" + "Test";
Der JVM behandelt die obige Aussage direkt als:
String S1 = „Dies ist nur ein einfacher Test“;
Die Geschwindigkeit ist also sehr schnell. Es ist jedoch zu beachten, dass das JVM, wenn die Spleißstring von einem anderen String -Objekt stammt, nicht automatisch konvertiert wird und die Geschwindigkeit beispielsweise nicht so schnell ist:
String S2 = "Dies ist nur ein"; String S3 = "Simple"; String S4 = "Test"; String S1 = S2 + S3 + S4;
Zu diesem Zeitpunkt wird das JVM dies auf die ursprüngliche Weise regelmäßig tun.
In den meisten Fällen, StringBuffer> String.
4.StringBuffer und StringBuilder
Es gibt fast keinen Unterschied zwischen den beiden. Sie rufen im Grunde verschiedene Methoden der Elternklasse auf. Ein wichtiger Unterschied ist, dass StringBuffer thread-sicher ist. Die meisten internen Methoden haben das Schlüsselwort vor ihm synchronisiert, was zu einem bestimmten Leistungsverbrauch führt. StringBuilder ist nicht-sicher und ist also effizienter.
public static void main (String [] args) löst eine Ausnahme aus {String string = "0"; int n = 10000; lange begin = system.currentTimemillis (); für (int i = 1; i <n; i ++) {String+= i; } Long End = System.currentTimemillis (); lang zwischen = Ende - Beginnen Sie; System.out.println ("Zeitverbrauch mit String -Klasse:" + zwischen + "ms"); int n1 = 10000; StringBuffer sb = new StringBuffer ("0"); lange begin1 = system.currentTimemillis (); für (int j = 1; j <n1; j ++) {sb.append (j); } Long End1 = System.currentTimemillis (); lang zwischen 1 = end1 - begin1; System.out.println ("Zeitverbrauch mit der StringBuffer -Klasse:" + zwischen 1 + "ms"); int n2 = 10000; StringBuilder sb2 = new StringBuilder ("0"); lange begin2 = system.currentTimemillis (); für (int k = 1; k <n2; k ++) {sb2.Append (k); } long End2 = System.currentTimemillis (); lang zwischen2 = end2 - begin2; System.out.println ("zeitaufwändig für die Verwendung von StringBuilder-Klasse:" + zwischen 2 + "ms"); } Ausgabe:
Zeit für die Verwendung von Stringklassen: 982Ms Zeit für die Verwendung von StringBuffer -Klasse: 2 ms Zeit für die Verwendung von StringBuilder -Klasse: 1ms
Obwohl diese Zahl jedes Mal anders ist und die Situation jeder Maschine unterschiedlich ist, gibt es mehrere Punkte, die sicher sind, und die Streicherklasse verbraucht erheblich mehr als die anderen beiden. Ein weiterer Punkt ist, dass StringBuffer mehr verbraucht als StringBuilder, obwohl der Unterschied nicht offensichtlich ist.
5 Nutzungsstrategien
(1) Grundprinzipien: Wenn Sie eine kleine Datenmenge betreiben möchten, verwenden Sie String. Wenn Sie eine große Datenmenge mit einem einzelnen Thread betreiben, verwenden Sie StringBuilder. Wenn Sie eine große Datenmenge mit einem Multi-Thread betreiben, verwenden Sie StringBuffer.
(2) Verwenden Sie nicht die "+" der String -Klasse zum häufigen Spleißen, denn wenn die Leistung extrem schlecht ist, sollten Sie die StringBuffer- oder StringBuilder -Klasse verwenden, was ein relativ wichtiges Prinzip bei der Java -Optimierung ist. Zum Beispiel: Verwenden Sie bei der Verwendung von String beim Spleißen von Zeichenfolgen "+", um ein temporäres StringBuffer -Objekt auf dem JVM zu bilden, und gleichzeitig wird ein Objekt in jeder Zeichenfolge erstellt. Nach zwei Saiten müssen insgesamt 4 Objekte erstellt werden! (Eine Zeichenfolge, die das Ergebnis, zwei String -Objekte und ein temporäres StringBuffer -Objekt enthält). Wenn Sie StringBuffer verwenden, müssen Sie nur 2 Objekte erstellen! Ein StringBuffer -Objekt und ein String -Objekt, das das letzte Ergebnis enthält.
(3) Für eine bessere Leistung sollte ihre Kapazität so weit wie möglich angegeben werden, wenn er Sturzbuffer oder Sturzbuilder errichtet. Wenn die von Ihnen betriebene Zeichenfolge 16 Zeichen nicht überschreitet, brauchen Sie sie natürlich nicht. Die Nichtbeachtung der Kapazität wird die Leistung erheblich verringern.
(4) StringBuilder wird im Allgemeinen innerhalb der Methode verwendet, um ähnliche "+" -Funktionen zu vervollständigen. Weil ? ist thread-sicher, es kann nach dem Gebrauch verworfen werden. StringBuffer wird hauptsächlich in globalen Variablen verwendet.
(5) Die Verwendung von STRURNGBuilder in derselben Situation kann im Vergleich zur Verwendung von StringBuffer nur eine Leistungsverbesserung von etwa 10% ~ 15% erzielen, es besteht jedoch das Risiko, dass Multi-Thread-Unsicherheit unsicher ist. In der realen modularen Programmierung kann der für ein bestimmte Modul verantwortliche Programmierer möglicherweise nicht klar feststellen, ob das Modul in eine Umgebung mit mehreren Threads gesteckt wird. Daher kann StringBuilder nur verwendet werden, es sei denn, Sie sind sicher, dass sich der Engpass des Systems im StringBuffer befindet und Sie sicher sind, dass Ihr Modul nicht im Multi-Thread-Modus ausgeführt wird. Andernfalls wird StringBuffer noch verwendet.