In Java, wann sollte ich String über StringBuilder lieber umgekehrt?

8

Ich weiß, dass StringBuilder gegenüber String vorzuziehen ist, weil String im Constant String Pool gehalten wird und ein neuer Wert zugewiesen wird, der die vorherigen Werte nicht überschreibt. StringBuilder ist jedoch ein Objekt, das seinen vorherigen Wert überschreibt.

  • In welchen Fällen sollte ich String über StringBuilder umgekehrt verwenden?
  • Auch wenn ich Variablen vom Typ String in Backing-Klassen von Hibernate habe, sollte ich StringBuilder verwenden? Wie?

    %Vor%
Daniel Newtown 24.06.2015, 08:59
quelle

5 Antworten

2

Sie sollten String verwenden, da String -Objekte in einem Objekt zwischengespeichert werden pool und liefert möglicherweise eine bessere Leistung, wenn Sie sie nicht ändern.

A StringBuilder ist nur nützlich, wenn Sie String -Token weiter verketten, was in einer normalisierten Datenbanktabelle nicht der Fall sein sollte.

Die JVM führt alle möglichen Optimierungen durch, und selbst wenn Sie eine Verkettung verwenden, schreibt die JVM diese Routine möglicherweise in eine StringBuilder-Version um.

Lesen Sie auch die Antwort auf diese Frage: link .

    
Vlad Mihalcea 30.06.2015, 14:04
quelle
2

Eine einfache Faustregel (String ist ein Typ, der Zeichenketten darstellt. StringBuilder ein Strom veränderbarer Zeichen)

Verwenden Sie String , um Textwerte darzustellen. Per Definition bietet Java das Pooling von String-Werten und damit eine Optimierung des Platzes. Stellen Sie sich das in einem Szenario vor, in dem Ihre Anwendung während einer Stapelverarbeitung mit Millionen von Textwerten arbeitet. Also als ein Beispiel.

%Vor%

Hier, str1 == str2 (gleiche Referenz)

Außerdem ist + operator in String überladen, um String aus verschiedenen Typen zu konstruieren. Dies kann verwendet werden, wenn kleine Strings erstellt werden (intern wird es mit StringBuilder gemacht, also keine Sorgen) - aber nicht während des Schleifens.

Verwenden Sie StringBuilder (oder altes Gegenstück StringBuffer ) nur, wenn Sie eine Zielzeichenfolge mit kleinen Teilen verschiedener Typen erstellen - und besonders innerhalb einer Schleife -, um das Platzieren zu vermeiden unnötige String-Fragmente im String-Pool.

%Vor%

Hier, s1! = s2

Ich glaube auch nicht, dass es irgendeinen Weg gibt, die Codierung von StringBuilder / Buffer zu manipulieren - In der Zwischenzeit erlaubt String dies.

Bearbeiten: Darstellung von Hibernate-Entitäten: Verwenden Sie immer String , um einen Texttyp in Ihrer Klasse darzustellen. Aus den oben genannten Gründen. Dies sollte zu Ihnen wie Muskelgedächtnis kommen. Beispiel: int , float , char usw. für primitive Typen und String für den Texttyp. Verwenden Sie den Builder nur zum Erstellen von Zeichenfolgen und nicht zum Darstellen eines Typs, es sei denn, dies ist eine seltsame Anforderung.

    
ring bearer 24.06.2015 15:14
quelle
2

Ich würde String für Textwerte verwenden, die fest sind.

Verwenden Sie StringBuilder, wenn Sie einen größeren Text String wie:

erstellen %Vor%

Verwenden Sie StringBuffer anstelle von StringBuilder für synchronisierte Werte, Siehe Ссылка für den Unterschied zwischen StringBuilder und StringBuffer.

JavaDoc: StringBuffer ( Ссылка ):

  

Eine thread-safe, veränderbare Folge von Zeichen. Ein String-Puffer ist wie   eine Zeichenfolge, kann aber geändert werden. Zu jedem Zeitpunkt enthält es einige   bestimmte Reihenfolge der Zeichen, aber die Länge und den Inhalt der   Sequenz kann durch bestimmte Methodenaufrufe geändert werden

JavaDoc: StringBuilder ( Ссылка ):

  

Eine veränderbare Zeichenfolge. Diese Klasse stellt eine API bereit   kompatibel mit StringBuffer, aber ohne Garantie für   Synchronisation. Diese Klasse ist für die Verwendung als Drop-In konzipiert   Ersatz für StringBuffer an Stellen, an denen der String-Puffer war   von einem einzelnen Thread verwendet werden (wie es im Allgemeinen der Fall ist). Woher   möglich, empfiehlt es sich, diese Klasse bevorzugt zu verwenden   StringBuffer, da es unter den meisten Implementierungen schneller ist.

JavaDoc: String ( Ссылка ):

  

Die String-Klasse repräsentiert Zeichenketten. Alle Zeichenfolgenliterale in   Als Beispiele werden Java-Programme wie "abc" implementiert   Klasse. Strings sind konstant; Ihre Werte können nicht nach ihnen geändert werden   sind erstellt. Zeichenfolgenpuffer unterstützen veränderbare Zeichenfolgen. Weil Zeichenfolge   Objekte sind unveränderlich, sie können geteilt werden

Im Grunde verwenden Sie String für Konstanten (unveränderlich) von Text.

    
Danielson 24.06.2015 09:01
quelle
1

Die java.lang.StringBuilder-Klassen sollten verwendet werden, wenn Sie viele Zeichenfolgen ändern müssen. Wie wir wissen, sind String-Objekte unveränderlich. Wenn Sie also mit String-Objekten eine Menge Manipulationen vornehmen, werden Sie Am Ende werden viele String-Objekte im String-Pool gelöscht. (Selbst in diesen Tagen mit Gigabyte RAM ist es keine gute Idee, wertvollen Speicher für verworfene String-Pool-Objekte zu verschwenden.) Andererseits können Objekte vom Typ StringBuilder immer wieder geändert werden, ohne dass eine große Menge verworfener Objekte zurückbleibt String-Objekte.

%Vor%     
Nitesh Soomani 24.06.2015 09:13
quelle
0

String ist unveränderliches Objekt, sobald es erstellt wurde, kann nicht geändert werden. Das als String erstellte Objekt wird im Constant String Pool gespeichert. Jedes unveränderliche Objekt in Java ist Thread-sicher, das bedeutet, dass String auch Thread-sicher ist. Die Zeichenfolge kann nicht gleichzeitig von zwei Threads verwendet werden. Die einmal zugewiesene Zeichenfolge kann nicht geändert werden.

%Vor%

Das obige Objekt wird im Konstanten-String-Pool gespeichert und sein Wert kann nicht geändert werden.

%Vor%

Die neue Zeichenfolge "Test2" wird im Konstantenpool erstellt und von der Demovariablen

referenziert

StringBuilder-Objekte sind veränderbar, wir können Änderungen an dem im Objekt gespeicherten Wert vornehmen. Das bedeutet effektiv, dass String-Operationen wie append effizienter sind, wenn sie StringBuilder-Objekte als String-Objekte verwenden.

%Vor%

Auch das obige Objekt wird im Heap gespeichert und sein Wert kann geändert werden

%Vor%

Die obige Anweisung ist richtig, da sie den Wert ändert, der im StringBuilder erlaubt ist.

Sie sollten also stringBuilder verwenden, wo Sie die Zeichenfolge häufig aktualisieren / ändern müssen.

    
Abhijit Bashetti 24.06.2015 09:23
quelle