Hoe kan ik een StringBuilder wissen of legen?

Ik gebruik een StringBuilderin een lus en elke x iteraties Ik wil het leegmaken en beginnen met een lege StringBuilder, maar ik zie geen methode die lijkt op de .NET StringBuilder.Clearin de documentatie, alleen de deletemethode die te ingewikkeld lijkt.

Dus wat is de beste manier om een StringBuilderin Java op te schonen?


Antwoord 1, autoriteit 100%

Twee manieren die werken:

  1. Gebruik stringBuilderObj.setLength(0).
  2. Wijs een nieuwe toe met new StringBuilder()in plaats van de buffer te wissen. Merk op dat voor prestatiekritieke codepaden deze benadering aanzienlijk langzamer kan zijn dan de op setLengthgebaseerde benadering (aangezien een nieuw object met een nieuwe buffer moet worden toegewezen, komt het oude object in aanmerking voor GC enz. ).

Antwoord 2, autoriteit 36%

Er zijn in principe twee alternatieven, met setLength(0)om de StringBuilder te resetten of om in elke iteratie een nieuwe te maken. Beide kunnen voor- en nadelen hebben, afhankelijk van het gebruik.

Als je van tevoren de verwachte capaciteit van de StringBuilder weet, zou het maken van een nieuwe elke keer net zo snel moeten gaan als het instellen van een nieuwe lengte. Het zal ook de vuilnisman helpen, aangezien elke StringBuilder een relatief korte levensduur heeft en de gc daarvoor is geoptimaliseerd.

Als u de capaciteit niet weet, is het wellicht sneller om dezelfde StringBuilder opnieuw te gebruiken. Elke keer dat u bij het toevoegen de capaciteit overschrijdt, moet een nieuwe backing-array worden toegewezen en moet de vorige inhoud worden gekopieerd. Door dezelfde StringBuilder opnieuw te gebruiken, zal deze na enkele iteraties de benodigde capaciteit bereiken en zal er daarna niet meer worden gekopieerd.


Antwoord 3, autoriteit 9%

deleteis niet al te ingewikkeld :

myStringBuilder.delete(0, myStringBuilder.length());

U kunt ook het volgende doen:

myStringBuilder.setLength(0);

Antwoord 4, autoriteit 4%

Als je naar de broncode voor een StringBuilder of StringBuffer kijkt, stelt de aanroep setLength() gewoon een indexwaarde voor de tekenreeks opnieuw in. IMHO met behulp van de setLength-methode zal altijd sneller zijn dan een nieuwe toewijzing. Ze hadden de methode ‘clear’ of ‘reset’ moeten noemen, zodat het duidelijker zou zijn.


Antwoord 5, autoriteit 2%

Ik stem voor sb.setLength(0);niet alleen omdat het één functieaanroep is, maar omdat het de array niet daadwerkelijk naar een andere array kopieertzoals sb.delete(0, builder.length());. Het vult gewoon de resterende tekens om 0 te zijn en stelt de lengtevariabele in op de nieuwe lengte.

Je kunt hun implementatie bekijken om mijn punt te valideren op hierbij de functie setLengthen de functie delete0.


Antwoord 6

U moet sb.delete(0, sb.length())of sb.setLength(0)gebruiken en GEEN nieuwe StringBuilder() maken.

p>

Zie dit gerelateerde bericht voor prestaties: is het beter om opnieuw te gebruiken een stringbuilder in een lus?


Antwoord 7

Ik denk dat veel van de antwoorden hier mogelijk een kwaliteitsmethode mist die zijn opgenomen in StringBuilder: .delete(int start, [int] end). Ik weet dat dit een late antwoord is; Dit moet echter bekend worden gemaakt (en een beetje grondiger uitgelegd).

Laten we zeggen dat je een stringbuildertabel hebt – die je wenst te wijzigen, dynamisch, in je hele programma (waar ik nu aan het werk doe, bijvoorbeeld), b.v.

StringBuilder table = new StringBuilder();

Als u door de methode loopt en de inhoud wilt wijzigen, gebruikt u de inhoud, wens dan de inhoud weg te gooien om de StringBuildervoor de volgende iteratie te verwijderen, kunt u de inhoud verwijderen, bijv.

table.delete(int start, int end). 

Start en eindigen de indices van de tekens die u wilt verwijderen. Weet de lengte niet in tekens en wil het hele ding verwijderen?

table.delete(0, table.length());

Nu, voor de kicker. StringBuilders, zoals eerder vermeld, neem veel overhead wanneer ze vaak worden gewijzigd (en kan veiligheidskwesties veroorzaken met betrekking tot draad); Gebruik daarom StringBuffer– hetzelfde als StringBuilder(met een paar uitzonderingen) – als uw StringBuilderwordt gebruikt met het oog op interfacing met de gebruiker.


Antwoord 8

StringBuilder s = new StringBuilder();
s.append("a");
s.append("a");
// System.out.print(s); is return "aa"
s.delete(0, s.length());
System.out.print(s.length()); // is return 0

is de gemakkelijke manier.


Antwoord 9

Als de prestaties de belangrijkste zorg is, is de ironie, naar mijn mening, de Java-constructen om de tekst te formatteren die in de buffer gaat, is veel meer tijdrovend op de CPU dan de toewijzing / RealLocation / Garbage Collection … Nou, mogelijk niet de GC (Garbage Collection), afhankelijk van het aantal bouwers dat u maakt en gooit.

Maar simpelweg een samengestelde reeks ("Hello World of " + 6E9 + " earthlings.") aan de buffer zal waarschijnlijk de hele zaak onbelangrijk maken.

En, echt, als een exemplaar van StringBuilderbetrokken is, dan is de inhoud complex en / of langer dan een eenvoudige String str = "Hi";Let op dat Java waarschijnlijk sowieso een bouwer op de achtergrond gebruikt).

Persoonlijk probeer ik de GC niet te misbruiken. Dus als het iets is dat veel wordt gebruikt in een snel brandscenario – zoals, zeg, zegt het schrijven van foutopsporingen – ik neem gewoon aan dat het elders elders kan verklaren en nul het uit voor hergebruik.

class MyLogger {
    StringBuilder strBldr = new StringBuilder(256);
    public void logMsg( String stuff, SomeLogWriterClass log ) {
        // zero out strBldr's internal index count, not every
        // index in strBldr's internal buffer
        strBldr.setLength(0);
        // ... append status level
        strBldr.append("Info");
        // ... append ' ' followed by timestamp
        // assuming getTimestamp() returns a String
        strBldr.append(' ').append(getTimestamp());
        // ... append ':' followed by user message
        strBldr.append(':').append(msg);
        log.write(strBldr.toString());
    }
}

Other episodes