String-Verkettung: concat() vs "+" Operator

Angenommen, String a und b:

a += b
a = a.concat(b)

Sind sie unter der Haube das Gleiche?

Hier ist concat als Referenz dekompiliert. Ich würde gerne auch den "+"-Operator dekompilieren können, um zu sehen, was er bewirkt.

public String concat(String s) {

    int i = s.length();
    if (i == 0) {
        return this;
    }
    else {
        char ac[] = new char[count + i];
        getChars(0, count, ac, 0);
        s.getChars(0, i, ac, count);
        return new String(0, count + i, ac);
    }
}

Niyaz ist richtig, aber es ist auch erwähnenswert, dass der spezielle +-Operator durch den Java-Compiler in etwas Effizienteres umgewandelt werden kann. Java hat eine StringBuilder-Klasse, die einen nicht thread-sicheren, veränderbaren String darstellt. Wenn Sie eine Reihe von String-Verkettungen durchführen, konvertiert der Java-Compiler stillschweigend

String a = b + c + d;

in um.

String a = new StringBuilder(b).append(c).append(d).toString();

was bei großen Zeichenketten wesentlich effizienter ist. Soweit ich weiß, geschieht dies nicht, wenn Sie die concat-Methode verwenden.

Die concat-Methode ist jedoch effizienter, wenn eine leere Zeichenkette mit einer vorhandenen Zeichenkette verknüpft wird. In diesem Fall muss die JVM kein neues String-Objekt erstellen und kann einfach das vorhandene zurückgeben. Siehe die concat-Dokumentation um dies zu bestätigen.

Wenn Sie also sehr auf Effizienz bedacht sind, sollten Sie die concat-Methode verwenden, wenn Sie möglicherweise leere Strings verketten, und ansonsten + verwenden. Der Leistungsunterschied sollte jedoch vernachlässigbar sein, und Sie sollten sich wahrscheinlich nie Gedanken darüber machen.

Kommentare (3)

Der Operator + kann zwischen einer Zeichenkette und einem String-, Char-, Integer-, Double- oder Float-Datentypwert eingesetzt werden. Er wandelt den Wert vor der Verkettung lediglich in seine String-Darstellung um.

Der concat-Operator kann nur auf und mit Zeichenketten angewendet werden. Er prüft die Kompatibilität der Datentypen und gibt einen Fehler aus, wenn sie nicht übereinstimmen.

Abgesehen davon macht der von Ihnen angegebene Code das Gleiche.

Kommentare (0)

Das glaube ich nicht.

a.concat(b)ist in String implementiert und ich denke, die Implementierung hat sich seit den frühen Java-Maschinen nicht viel geändert. Die Implementierung der+Operation hängt von der Java Version und dem Compiler ab. Derzeit wird+mit [StringBuffer][1] implementiert, um die Operation so schnell wie möglich zu machen. Vielleicht wird sich dies in Zukunft ändern. In früheren Versionen von Java war die+` Operation auf Strings viel langsamer, da sie Zwischenergebnisse produzierte.

Ich vermute, dass += mit + implementiert und in ähnlicher Weise optimiert wurde.

Kommentare (2)