Heim  >  Artikel  >  Java  >  Sie müssen String, StringBuilder und StringBuffer herausfinden

Sie müssen String, StringBuilder und StringBuffer herausfinden

无忌哥哥
无忌哥哥Original
2018-07-20 09:37:071263Durchsuche

Die Beziehung und der Unterschied zwischen den drei Klassen String, StringBuilder und StringBuffer waren schon immer ein klassisches Thema in Java. Dieses Mal werde ich über einige Kenntnisse über diese drei Klassen sprechen

Einfacher Vergleich

  • String: Zeichenkonstante

  • StringBuilder: Zeichenvariable

  • StringBuffer: Zeichenvariable

String ist ein konstanter Typ und wird als endgültige Klasse deklariert. Sobald das String-Objekt erstellt wurde, kann es nicht mehr geändert werden.
Die beiden Klassen StringBuilder/StringBuffer gehören zur Variablen Typen können geändert werden, sie sind alle Klassen, die bereitgestellt werden, um das Problem zu lösen, dass durch die Zeichenfolgenverkettung zu viele Zwischenobjekte entstehen.

  • Laufgeschwindigkeit StringBuilder > StringBuffer > String

  • Thread-Sicherheit: StringBuffer

  • Nicht Thread-Sicherheit: StringBuilder

StringBuilder unterscheidet sich im Wesentlichen nicht wesentlich von StringBuffer, aber da StringBuilder den Thread-Sicherheitsteil von StringBuffer entfernt, wird der Overhead effektiv reduziert. Daher ist StringBuilder in den meisten Fällen die erste Wahl für String-Splicing-Vorgänge

2. String-Verarbeitung von Strings

Beispiel 1:

String s = "abcd";
s = s + "fgh";

Viele Leute Wann Bei einer solchen String-Verarbeitung wird fälschlicherweise angenommen, dass der String-Typ variabel ist.

Aber tatsächlich ist der Prozess der JVM-Verarbeitung dieses Codes wie folgt: Erstellen Sie zuerst das s-Objekt, weisen Sie den Wert „abcd“ zu, und erstellen Sie dann bei der Verarbeitung der zweiten Codezeile ein weiteres s-Objekt und weisen Sie es zu der Wert „abcdfgh“ und dann Das erste s-Objekt wird durch Müll gesammelt.

Es ist also gleichbedeutend damit, dass sich das erste s nicht ändert, das zweite s ist ein neues Objekt

Beispiel 2:

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

Dieser Code ist äquivalent zuString str = “This is only a simple test”;

Beispiel 3:

String str2 = "This is only a";
String str3 = "simple";
String str4 = "test";
String str1 = str2 +str3 + str4;

Dieser Code wird auch gemäß dem Prozess von Beispiel 1 verarbeitet

3. StringBuilder / StringBuffer-Konstruktionsmerkmale

Diese beiden Objekte Während Beantragen Sie im Konstruktionsprozess zunächst ein Zeichenarray (char[]) entsprechend der Standardgröße. Wenn diese jedoch überschritten wird, wird Arrays.copyOf() verwendet, um die Kapazität auf 16, 32, zu verdoppeln. 64, 128.. . Dies wirkt sich natürlich auf die Leistung aus, sodass Sie die Kapazität beim Erstellen eines Objekts nach Bedarf anpassen können

//默认 16 个字符
public StringBuilder() {
    super(16);
}
//构造函数定义容量
public StringBuilder(int capacity) {
    super(capacity);
}

4. Vergleich der String- und StringBuilder-Verarbeitung des String-Spleißens

Wir Jeder weiß, dass String-Verkettung Es wird empfohlen, StringBuilder während des Spleißvorgangs zu verwenden. Wird jedoch immer empfohlen, StringBuilder anstelle von String zum String-Spleißen zu verwenden? Offensichtlich nicht.

Beispiel 1:

String str = "123";
String str1 = str + "456";
String str2 = new StringBuilder().append(str).append("def").toString();

In diesem Fall gibt es kaum einen Unterschied in der Effizienz zwischen den beiden Verarbeitungsmethoden

InJDK 8, der String-Splice-Vorgang wird vom Compiler automatisch in StringBuilder konvertiert und die Append-Methode wird aufgerufen. Aufgrund dieses Optimierungsschemas unterscheidet sich die Verarbeitungseffizienz der beiden Klassen in diesem Fall nicht wesentlich 🎜>JDK 9 Um String-Operationen gleichmäßiger zu optimieren, wird StringConcatFactory als einheitlicher Eingang bereitgestellt, um String-Spleißoperationen weiter zu optimieren.

Beispiel 2:

String str = "";
for (int i = 0; i < 1000; i++) {
    str += "12345";
}

StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    stringBuilder.append("12345");
}

In diesem Fall ist StringBuilder schneller

In der Schleife wird jedes Mal, wenn „+“ ausgeführt wird, ein String-Objekt erstellt Daher wird es viel Objekterstellung und Recyclingverbrauch geben.

Um es einfach auszudrücken: In der

-Schleife, um String-Splicing für dasselbe String-Objekt durchzuführen, StringBuilder

Beispiel 3 wird bevorzugt

String str1 = "123" + "456" + "789";

String str2 = new StringBuilder("123").append("456").append("789").toString();

In diesem Fall ist String schneller

Wir alle wissen, dass

eigentlich äquivalent zu String str1 = "123" + "456" + "789"; ist, aber StringBuilder muss die Append-Methode mehrmals aufrufen. String str1 = "123456789";

Das obige ist der detaillierte Inhalt vonSie müssen String, StringBuilder und StringBuffer herausfinden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen 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