Frage

Strings sind unveränderlich, das heißt, sobald sie erstellt wurden, können sie nicht mehr geändert werden.

Also, bedeutet dies, dass es würde mehr Speicher nehmen, wenn Sie Dinge anhängen mit + = als wenn Sie einen String erstellt und den beigefügten Text das?

Wenn Sie + = verwenden, würden Sie ein neues ‚Objekt‘ erstellen jedes Mal, die im Speicher gespeichert werden muss, würden Sie nicht?

War es hilfreich?

Lösung

Ja, erstellen Sie ein neues Objekt jedes Mal mit + =. Das bedeutet nicht, es ist immer die falsche Sache, aber zu tun. Es hängt davon ab, ob Sie diesen Wert als String wollen, oder ob Sie es gerade nicht benutzen wollen die Zeichenfolge bis weiter zu bauen.

Wenn Sie wirklich wollen das Ergebnis x + y als String, dann könnten Sie auch nur String-Verkettung verwenden. wenn Sie wirklich Allerdings gehen (sagen wir) Schleife um und eine andere Zeichenfolge anhängen, und eine andere, usw. - nur das Ergebnis als String am Ende brauchen, dann String / String sind der Weg zu gehen. Tatsächlich Looping ist wirklich, wo String über String-Verkettung zahlt sich aus - den Leistungsunterschied für 5 oder sogar 10 direkte Verkettungen wird recht klein sein, aber für Tausende wird es viel schlimmer - im Grunde, weil Sie erhalten O (N 2 ) Komplexität mit Verkettung vs O (N) Komplexität mit String.

In Java 5 und höher, sollten Sie grundsätzlich Stringbuilder verwenden - es ist nicht synchronisiert, aber das ist fast immer in Ordnung; es ist sehr selten zu wollen, einen zwischen Threads zu teilen.

Ich habe eine Artikel über all diese , die Ihnen nützlich sein könnten.

Andere Tipps

Daumenregel ist einfach:

Wenn Sie Verkettungen in einer Schleife, nicht verwenden +=

laufen

Wenn Sie nicht Verkettungen in einer Schleife ausgeführt wird, unter Verwendung von += einfach keine Rolle spielt. (Es sei denn, eine Performance kritische Anwendung

In Java 5 oder höher, ist String Thread-sicher, und hat so einigen Aufwand, die Sie nicht bezahlen sollten, wenn Sie es brauchen. Stringbuilder hat die gleiche API, ist aber nicht sicher Thread (das heißt Sie es nur intern zu einem einzigen Thread verwendet werden soll).

Ja, wenn Sie große Strings sind Aufbau, ist es effizienter, Stringbuilder zu verwenden. Es ist wahrscheinlich nicht wert String oder String um als Teil Ihrer API zu übergeben. Dies ist zu verwirrend.

Ich stimme mit all den Antworten oben geschrieben, aber es wird Ihnen ein wenig helfen, mehr über die Art und Weise zu verstehen, Java implementiert ist. Die JVM verwendet Stringbuffers intern den String + Betreiber zusammenzustellen (Aus dem String Javadoc ):

  

String-Puffer werden durch die verwendete   Compiler zu implementieren, um die binären   Stringverknüpfungsoperator +. Zum   Beispiel der Code:

     x = "a" + 4 + "c"
     

ist mit dem Äquivalent von zusammengestellt:

     x = new StringBuffer().append("a").append(4).append("c")
                           .toString()

Ebenso ist x += "some new string" zu x = x + "some new string" gleichwertig. Siehst du, wohin ich gehe mit diesem?

Wenn Sie eine Menge von String-Verkettungen tun, String verwenden, werden Ihre Leistung steigern, aber wenn Sie nur ein paar einfachen String Verkettungen tun, werden die Java-Compiler wahrscheinlich optimieren es für Sie, und Sie werden nicht merken, ein Unterschied in der Leistung

Ja. String ist unveränderlich. Für den gelegentlichen Gebrauch, + = ist OK. Wenn der + = Betrieb intensiv ist, sollten Sie auf String drehen.

Aber die Garbage Collector wird am Ende der alten Saiten zu befreien, wenn es keine Verweise auf sie sind

Genau. Sie sollten allerdings einen String verwenden, wenn Thread-Sicherheit ist kein Problem.

Als Randbemerkung: Es könnte mit dem gleichen Trägern char mehr String-Objekte sein [] - zum Beispiel, wenn Sie String () verwenden, keine neue char [] werden erstellt, die es sehr effizient mit macht.

Darüber hinaus Compiler kann für Sie einige Optimierungen tun. Zum Beispiel, wenn Sie tun

static final String FOO = "foo";
static final String BAR = "bar"; 

String getFoobar() {
  return FOO + BAR; // no string concatenation at runtime
}

würde ich nicht überrascht, wenn der Compiler String intern verwenden würde String-Verkettung, wo möglich zu optimieren -. Wenn nicht bereits vielleicht in der Zukunft

Ich denke, es auf der GC setzt den Speicher mit dem verlassenen Zeichenfolge zu sammeln. So wird tun, + = mit String-Builder auf jeden Fall schneller, wenn Sie eine Menge Betrieb auf String-Manipulation haben. Aber es ist nicht ein Problem für die meisten Fälle.

Ja, Sie würde und das ist genau, warum Sie String verwenden sollten eine Menge von Strings zu verketten.

Beachten Sie auch, dass seit Java 5 auch String die meiste Zeit bevorzugen sollte. Es ist nur eine Art von unsynchronisierten String.

Sie haben Recht, dass Strings unveränderlich sind, so dass, wenn Sie versuchen, um Speicher zu sparen, während eine Menge von String-Verkettung tun, sollten Sie Stringbuilder verwenden, anstatt + =.

Sie können jedoch nichts dagegen. Die Programme sind für ihre menschlichen Leser geschrieben, so dass Sie mit Klarheit gehen. Wenn es wichtig ist, dass Sie zu optimieren, sollten Sie zuerst das Profil. Es sei denn, Ihr Programm ist sehr stark auf String-Aktivität gewichtet, wird es wahrscheinlich andere Engpässe sein.

Nein

Es wird nicht mehr Speicherplatz. Ja, neue Objekte erstellt werden, aber die alten recycelt werden. Am Ende der verwendete Speichermenge ist das gleiche.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top