1121 Stimmen

StringBuilder gegen String-Konkatenation in toString() in Java

Angesichts der beiden unten stehenden toString()-Implementierungen, welche ist bevorzugt:

public String toString(){
    return "{a:"+ a + ", b:" + b + ", c: " + c +"}";
}

oder

public String toString(){
    StringBuilder sb = new StringBuilder(100);
    return sb.append("{a:").append(a)
          .append(", b:").append(b)
          .append(", c:").append(c)
          .append("}")
          .toString();
}

?

Noch wichtiger ist, dass wir nur 3 Eigenschaften haben und es keinen Unterschied machen könnte, aber ab wann würden Sie von der Verwendung von + für die Konkatenierung zu StringBuilder wechseln?

63 Stimmen

An welchem Punkt wechseln Sie zu StringBuilder? Wenn es sich auf den Speicher oder die Leistung auswirkt. Oder wenn es sein könnte. Wenn Sie dies wirklich nur einmal für ein paar Zeichenfolgen tun, keine Sorgen. Aber wenn Sie es immer wieder tun werden, sollten Sie einen messbaren Unterschied feststellen, wenn Sie StringBuilder verwenden.

1 Stimmen

Was bedeutet 100 als Parameter?

3 Stimmen

@Unbekannt 100 ist die Anfangsgröße des StringBuilder

5voto

VishalTambe Punkte 157

Ich denke, wir sollten den StringBuilder-Ansatz verwenden. Der Grund ist:

  1. Die String-Konkatenation wird jedes Mal ein neues String-Objekt erstellen (da String ein unveränderbares Objekt ist), also wird es 3 Objekte erstellen.

  2. Bei StringBuilder wird nur ein Objekt erstellt[der StringBuilder ist veränderlich] und der weitere String wird daran angehängt.

1 Stimmen

Warum wird diese Antwort heruntergestuft? docs.oracle.com/javase/8/docs/api/java/util/stream/… - Mutable Reduktion

4voto

Machen Sie die toString-Methode so lesbar wie möglich!

Die einzige Ausnahme in meinem Buch ist, wenn Sie mir beweisen können, dass sie signifikante Ressourcen verbraucht :) (Ja, das bedeutet Profiling)

Beachten Sie auch, dass der Java 5-Compiler schnelleren Code generiert als der von Hand geschriebene "StringBuffer"-Ansatz, der in früheren Versionen von Java verwendet wurde. Wenn Sie "+" verwenden, kommen diese und zukünftige Verbesserungen kostenlos dazu.

3voto

Eddy Punkte 3233

Es scheint eine Debatte darüber zu geben, ob die Verwendung von StringBuilder mit aktuellen Compilern noch notwendig ist. Deshalb dachte ich, ich gebe meine Erfahrung von 2 Cent ab.

Ich habe einen JDBC Resultatsatz von 10.000 Datensätzen (ja, ich brauche sie alle in einem Batch). Die Verwendung des + Operators dauert auf meinem Rechner mit Java 1.8 etwa 5 Minuten. Die Verwendung von stringBuilder.append("") dauert weniger als eine Sekunde für dieselbe Abfrage.

Der Unterschied ist also riesig. Innerhalb einer Schleife ist StringBuilder viel schneller.

3 Stimmen

Ich denke, die Debatte dreht sich darum, es außerhalb von Schleifen zu verwenden. Ich glaube, es besteht Einigkeit darüber, dass man es innerhalb einer Schleife verwenden muss.

3voto

nagendra547 Punkte 4304

Hier ist, was ich in Java8 überprüft habe.

  • Verwendung von Zeichenkettenverkettung
  • Verwendung von StringBuilder

    long time1 = System.currentTimeMillis();
    usingStringConcatenation(100000);
    System.out.println("usingStringConcatenation " + (System.currentTimeMillis() - time1) + " ms");
    
    time1 = System.currentTimeMillis();
    usingStringBuilder(100000);
    System.out.println("usingStringBuilder " + (System.currentTimeMillis() - time1) + " ms");
    
    private static void usingStringBuilder(int n)
    {
        StringBuilder str = new StringBuilder();
        for(int i=0;i

`> Es ist wirklich ein Albtraum, wenn Sie Zeichenkettenverkettung für eine große Anzahl von Zeichenketten verwenden.

usingStringConcatenation 29321 ms
usingStringBuilder 2 ms`

3voto

N Droidev Punkte 816

Ich denke, dieses Bild wäre sehr nützlich, um alle Klassen zum Arbeiten mit Strings zu vergleichen:

Bildbeschreibung hier eingeben

1 Stimmen

Könnten Sie bitte mitteilen, welche Java-Version Sie verwendet haben?

3 Stimmen

@wayne hat das Bild von diesem Blog kopiert. Anhand seines pom.xml handelt es sich um Java 7.

0 Stimmen

@wayne Ich glaube nicht, dass sich das so sehr unterscheiden wird.. Die Leistungsverhältnisse werden wahrscheinlich in allen Versionen gleich sein.. Ich kenne die Version nicht, weil ich es in einem Blog gefunden habe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X