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
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
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
String str = “This is only a” + “simple” + “test”;
Dieser Code ist äquivalent zuString str = “This is only a simple test”;
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
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); }
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.
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 bevorzugtString 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!