JavaRush /Java-Blog /Random-DE /String += String oder StringBuilder.append(String)?
SemperAnte
Level 4
Донецк

String += String oder StringBuilder.append(String)?

Veröffentlicht in der Gruppe Random-DE
In diesem Artikel möchte ich den Unterschied zwischen der Append-Methode der Klasse StringBuilderund dem Operator +=for betrachten, analysieren, erklären und zeigen String. Dabei wird es weniger um Anwendungsbereiche als vielmehr um die Codeoptimierung gehen.
String += String oder StringBuilder.append(String)?  - 1
Ja, eine Person, die sich zweifellos nicht intensiv mit dieser Frage beschäftigt hat, wird sagen: „Warum sollte ich den Operator += ersetzen, indem ich ein neues Objekt einer völlig anderen Klasse erstelle und dann auch die Methode aufrufe toString()? Was für eine Optimalität sind wir?“ redest du? Die Wahl liegt auf der Hand, wovon redest du?“ und er würde völlig falsch liegen. Eines der Probleme besteht darin, dass Stringes nicht primitiv ist. String– ein Objekt wie jedes andere classin Java, und wie Sie wissen, gibt es in Java keine Operatorüberladung (wie zum Beispiel in C++), Operatoren werden nur für Grundelemente definiert und für jede Klasse können wir keinen Operator überschreiben. Deshalb sind die Operatoren „ +“ und „ += “ eine Art „Krücke“ der Java-Bibliothek, und eine Krücke bringt immer Verluste mit sich. Hören wir eigentlich auf, am Schwanz der Katze zu ziehen, und gehen wir zu den Messungen über. Hier ist ein einfaches Programm, das die Zeit misst, die benötigt wird, um eine Linie mit einer Schleifenvariablen 100.000 Mal zu „kleben“.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        String s = "Hallo";
        for(int i = 0; i < 100000; ++i)
        {
            s+=i;
        }
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
Auf meinem Computer wurden in der Konsole 6815ms angezeigt. Das heißt, mein Computer brauchte fast 7 Sekunden, um diese Linie zusammenzufügen. Jetzt ersetzen wir es durch StringBuilder und beziehen die Methode sogar toString()in die Messungen ein.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        StringBuilder sb = new StringBuilder("Hallo");
        for(int i = 0; i < 100000; ++i)
        {
            sb.append(i);
        }
        String s = sb.toString();
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
Mein PC sagte mir 10 ms. Das sind 0,01 Sekunden. Ich denke, der Unterschied in der Praxis ist ziemlich deutlich: Grob gesagt hat es 700-mal appendschneller funktioniert. +Dies liegt an der Tatsache, dass „ “ und „ “ höchstwahrscheinlich +=selbst das gleiche append aufrufen können, gleichzeitig aber einen langen Weg durch die Krücken der Sprache gegangen sind, um zu verstehen, dass ein solcher Operator überhaupt existiert und was er bedeutet tun sollte (der letzte Absatz ist nichts weiter als eine Vermutung, ich bin kein JVM-Entwickler und weiß nicht, was da ist und wie). Dies ist ein klares Beispiel dafür, dass ein zusätzliches Objekt nicht immer kostspielig ist. Ja, der Code wird ein paar Zeilen länger, aber die Zeitersparnis kann bei großen Projekten enorm sein. Bitte beachten Sie, dass die Messungen nicht auf einem Büro-PC mit einem prähistorischen Prozessor durchgeführt wurden, aber stellen Sie sich nun vor, welchen Unterschied es auf diesem Bürocomputer machen wird, der kaum den Schal ziehen kann.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION