Nein, nicht ganz.
Erstens gibt es einen kleinen semantischen Unterschied. Wenn a
est null
dann a.concat(b)
wirft eine NullPointerException
sondern a+=b
wird der ursprüngliche Wert von a
als wäre es null
. Außerdem ist die concat()
Methode akzeptiert nur String
Werte, während die +
Operator wandelt das Argument stillschweigend in eine Zeichenkette um (unter Verwendung der toString()
Methode für Objekte). Daher ist die concat()
Methode ist strenger in Bezug auf das, was sie annimmt.
Um einen Blick unter die Haube zu werfen, schreiben Sie eine einfache Klasse mit a += b;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
Demontieren Sie nun mit javap -c
(im Sun JDK enthalten). Sie sollten eine Auflistung 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 zu
a = new StringBuilder()
.append(a)
.append(b)
.toString();
El concat
Methode sollte schneller sein. Bei mehr Zeichenketten wird jedoch die StringBuilder
Methode gewinnt, zumindest was die Leistung angeht.
Der Quellcode von String
y StringBuilder
(und seine paketprivate Basisklasse) ist in src.zip des Sun JDK verfügbar. Sie können sehen, dass Sie ein Char-Array aufbauen (und die Größe nach Bedarf ändern) und es dann wegwerfen, wenn Sie die endgültige String
. In der Praxis ist die Speicherzuweisung erstaunlich schnell.
Aktualisierung: Wie Pawel Adamski feststellt, hat sich die Leistung in neueren HotSpot. javac
erzeugt immer noch genau denselben Code, aber der Bytecode-Compiler schummelt. Einfache Tests schlagen völlig fehl, weil der gesamte Code weggeworfen wird. Summieren System.identityHashCode
(nicht String.hashCode
) zeigt die StringBuffer
Code hat einen leichten Vorteil. Dies kann sich ändern, wenn das nächste Update veröffentlicht wird oder wenn Sie eine andere JVM verwenden. Von @lukaseder , eine Liste von HotSpot JVM-Intrinsics .