Unerwartet unbekannte grundlegende Tipps zu StringBuilder [Java / C #]

Initialisieren, während eine Instanz von StringBuilder am Leben bleibt

Ich verwende RingBuilder, um die Zeichenfolgenbindung zu beschleunigen, aber ich denke, es gibt Zeiten, in denen ich Instanzen wiederverwenden möchte.

Dies ist beispielsweise der Implementierungscode.

Codebeispiel (C.#)



StringBuilder sb;

foreach( var x in data )
{
    sb = new StringBuilder();
    
    //Verarbeitung zum Bearbeiten einer Zeichenfolge
    
    string text = sb.ToString();
}

Codebeispiel (Java)



StringBuilder sb;

for ( Object x : data ) {
    sb = new StringBuilder();
    
    //Verarbeitung zum Bearbeiten einer Zeichenfolge
    
    String text = sb.toString();
}

Kurz gesagt, es wird eine Instanz neu erstellt, um die Bearbeitungszeichenfolge zu löschen.

Ich denke, es ist ein Code, den Sie oft sehen.

Der Bearbeitungsprozess selbst ist jedoch nicht sehr aufwendig. In Fällen, in denen die Kosten für die Erstellung einer Instanz von StringBuilder höher sind, sollten Sie die Instanz wiederverwenden.

So löschen Sie StringBuilder

Was den Titel "Unerwartet unbekannt" betrifft, bietet StringBuilder eine Möglichkeit, den internen Zeichenpuffer * (← leicht irreführende Erklärung) * zu löschen, während die Instanz am Leben bleibt.

Codebeispiel (C.#)



var sb = new StringBuilder(); 

foreach( var x in data )
{
    sb.Length = 0; //Dadurch wird die zuvor bearbeitete Zeichenfolge gelöscht und Sie können eine neue Bearbeitung starten.
    
    //Verarbeitung zum Bearbeiten einer Zeichenfolge
    
    string text = sb.ToString();
}

Codebeispiel (Java)



StringBuilder sb = new StringBuilder();

for ( Object x : data ) {
    sb.setLength(0);
    
    //Verarbeitung zum Bearbeiten einer Zeichenfolge
    
    String text = sb.toString();
}

Um ehrlich zu sein, als ich zum ersten Mal von dieser Methode erfuhr, dachte ich ** "Ich wünschte, ich hätte stattdessen die StringBuilder.Clear () -Methode vorbereitet!" **.

Nun, die Anzahl der Clear-Methoden hat zugenommen.

C#: https://msdn.microsoft.com/ja-jp/library/system.text.stringbuilder.clear(v=vs.110).aspx

Java: Ich habe es nachgeschlagen, aber Java hatte keine klareren Methoden. Wird es mit Java 9 zunehmen? ??

Ergänzende Erklärung @Java

In Java generiert der Operator "+", der die Verkettung von Zeichenfolgen ausführt (anscheinend aus einer älteren Version), beim Kompilieren Bytecode mit StringBuilder.

Ich habe Java aus der Java 7-Ära eingegeben (als ich aufgeregt war zu hören, dass Lambdas in Java 8 hinzugefügt wurden), also wusste ich es überhaupt nicht, bis ich verschiedene Dinge recherchierte. Abgesehen davon hat sich die interne Implementierung von Teilzeichenfolgen geändert, und es scheint, dass es aufgrund seiner langen Geschichte (als C #) verschiedene Änderungen gegeben hat. Daher wäre es interessant, auch diesen Bereich zu untersuchen.

Code implementiert mit dem Plus-Operator



String a = "Korrekt,";
String b = "wir";
String c = "Weil es klug ist."
String text = a + b + c; //Ja, weil wir schlau sind.

Code, der dem Kompilierungsergebnis entspricht



String a = "Korrekt,";
String b = "wir";
String c = "Weil es klug ist."
String text = new StringBuilder().append( a ).append( b ).append( c ).toString(); //Ja, weil wir schlau sind.

Vorsichtsmaßnahmen und andere Dinge, die danach kommen.

** Mach StringBuilder nicht zu lang: **

Obwohl es Möglichkeiten gibt, dies zu löschen, ist StringBuilder in erster Linie ein Bearbeitungspuffer und sollte keine sehr lange Lebensdauer haben. Vor allem gibt es keine Möglichkeit, wie oft oder zehnmal die Verarbeitungsgeschwindigkeit mit diesem Clearing-Mittel erhöht werden kann.

Übertreibe es nicht.

** Es ist nur ein "Bearbeitungsbereich", ein Puffer: **

Die Haltung, dass StringBuilder nur ein Pufferbereich während der Bearbeitung ist, sollte nicht geändert werden. Das Wiederverwenden, Löschen und Verwenden einer Instanz sollte bestenfalls durch "eine Ebene unterdrückt werden, die innerhalb des Prozesses abgeschlossen wird, der mit einer einzelnen öffentlichen Methode beginnt".

Ein weiteres wichtiges Kriterium ist, ob der Code "new StringBuilder ();" zu laut wie Rauschen ist. Wenn dies im Vergleich zur kurzen und einfachen Hauptlogik zu auffällig ist, wäre es meiner Meinung nach besser, wenn Sie "sb.Clear ();" schreiben könnten, um den Code intuitiver zu gestalten.

** Denken Sie an die Length-Eigenschaft: **

Auch persönlich ist es in erster Linie nicht intuitiv, dass "ein Wert für die Länge festgelegt werden kann, eine Eigenschaft, die die Anzahl der Zeichen als Ergebnis der Bearbeitung einer Zeichenfolge erhält", und dies wird als Löschmittel bereitgestellt. Ich fragte mich, wie es wohl war. Die Länge ist schreibgeschützt, und ich denke, die Clear-Methode sollte als Mittel zum Löschen bereitgestellt werden.

Nun, es ist gut, weil ich heutzutage selten "Zeichenketten in einem Durcheinander aufbaue".

Recommended Posts

Unerwartet unbekannte grundlegende Tipps zu StringBuilder [Java / C #]
Informationen zur Java StringBuilder-Klasse
[Java] Über String und StringBuilder
Java-Tipps, Tipps
[Grundkenntnisse in Java] Informationen zur Typkonvertierung
Java-Tipps
Über die Java-Schnittstelle
[Java] Informationen zu Java 12-Funktionen
Java-Code-TIPPS
[Java] Über Arrays
Grundlegende Java-Grammatik
Grundlegende Java-Grammatik
Java Grundkenntnisse 1
Etwas über Java
Wo ist mit Java?
Informationen zu Java-Funktionen
[Java] Grundstruktur
[Java] [Basic] Glossar
Über Java-Threads
[Java] -Schnittstelle
Über die Java-Klasse
Grundlegende Java-Grammatik
Informationen zu Java-Arrays
Grundlegende Java-Grammatik
Über Java-Vererbung
Über Schnittstelle, Java-Schnittstelle
Java-Übung [Basic]
Über Java Var
Über Java Literal
Informationen zu Java-Befehlen
Informationen zum Java-Grunddatentyp- und Referenztypspeicher