Nein, nicht ganz.
Erstens gibt es einen kleinen Unterschied in der Semantik. Wenn dies der Fall a
ist null
, wird a a.concat(b)
ausgelöst, NullPointerException
aber a+=b
der ursprüngliche Wert von wird so behandelt, a
als wäre er es null
. Darüber hinaus concat()
akzeptiert die Methode nur String
Werte, während der +
Operator das Argument stillschweigend in einen String konvertiert (unter Verwendung der toString()
Methode für Objekte). Die concat()
Methode ist also strenger in dem, was sie akzeptiert.
Um unter die Haube zu schauen, schreiben Sie eine einfache Klasse mit a += b;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
Jetzt zerlegen mit javap -c
(im Sun JDK enthalten). Sie sollten eine Liste sehen, die Folgendes enthält:
java.lang.String cat(java.lang.String, java.lang.String);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: aload_1
8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_2
12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/ String;
18: astore_1
19: aload_1
20: areturn
Also a += b
ist das Äquivalent von
a = new StringBuilder()
.append(a)
.append(b)
.toString();
Die concat
Methode sollte schneller sein. Mit mehr Strings StringBuilder
gewinnt die Methode jedoch zumindest in Bezug auf die Leistung.
Der Quellcode von String
und StringBuilder
(und seine paketprivate Basisklasse) ist in src.zip des Sun JDK verfügbar. Sie können sehen, dass Sie ein char-Array erstellen (Größe nach Bedarf ändern) und es dann wegwerfen, wenn Sie das Finale erstellen String
. In der Praxis ist die Speicherzuweisung überraschend schnell.
Update: Wie Pawel Adamski feststellt, hat sich die Leistung im neueren HotSpot geändert. javac
produziert immer noch genau den gleichen Code, aber der Bytecode-Compiler betrügt. Einfache Tests schlagen völlig fehl, weil der gesamte Code weggeworfen wird. Summieren System.identityHashCode
(nicht String.hashCode
) zeigt, dass der StringBuffer
Code einen leichten Vorteil hat. Änderungen vorbehalten, wenn das nächste Update veröffentlicht wird oder wenn Sie eine andere JVM verwenden. Von @lukaseder , eine Liste der HotSpot JVM-Eigenschaften .