Bei Verwendung der neuesten Version von Java(1.8) zeigt die Disassembly(javap -c
) die Optimierung, die vom Compiler eingeführt wurde. Sowohl +
als auch sb.append()
werden sehr ähnlichen Code generieren. Es wird jedoch sinnvoll sein, das Verhalten zu überprüfen, wenn wir +
in einer for-Schleife verwenden.
Hinzufügen von Strings mit + in einer for-Schleife
Java:
public String myCatPlus(String[] vals) {
String result = "";
for (String val : vals) {
result = result + val;
}
return result;
}
ByteCode:(for
-Schleifen-Auszug)
12: iload 5
14: iload 4
16: if_icmpge 51
19: aload_3
20: iload 5
22: aaload
23: astore 6
25: new #3 // class java/lang/StringBuilder
28: dup
29: invokespecial #4 // Method java/lang/StringBuilder."":()V
32: aload_2
33: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
36: aload 6
38: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
41: invokevirtual #6 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
44: astore_2
45: iinc 5, 1
48: goto 12
Hinzufügen von Strings mit stringbuilder.append
Java:
public String myCatSb(String[] vals) {
StringBuilder sb = new StringBuilder();
for(String val : vals) {
sb.append(val);
}
return sb.toString();
}
ByteCode:(for
-Schleifen-Auszug)
17: iload 5
19: iload 4
21: if_icmpge 43
24: aload_3
25: iload 5
27: aaload
28: astore 6
30: aload_2
31: aload 6
33: invokevirtual #5 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
36: pop
37: iinc 5, 1
40: goto 17
43: aload_2
Es gibt jedoch einen auffälligen Unterschied. Im ersten Fall, in dem +
verwendet wurde, wird für jede For-Schleifen-Iteration ein neuer StringBuilder
erstellt und das generierte Ergebnis wird durch Aufruf von toString()
gespeichert (29 bis 41). Sie generieren also Zwischenzeichenfolgen, die Sie wirklich nicht benötigen, wenn Sie den +
-Operator in einer for
-Schleife verwenden.
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
1 Stimmen
@nonsequitor Also werden die maximalen Zeichen 100 sein?
12 Stimmen
@Unbekannt nein nur die anfängliche Größe, wenn Sie die ungefähre Größe des Strings kennen, mit dem Sie arbeiten, können Sie
StringBuilder
mitteilen, wie viel Speicher vorab zuzuweisen ist, sonst wird, wenn der Speicherplatz ausgeht, die Größe verdoppelt, indem ein neueschar[]
Array erstellt und die Daten kopiert werden - was teuer ist. Sie können schummeln, indem Sie die Größe angeben und dann ist keine Notwendigkeit für diese Arrayerstellung - also, wenn Sie denken, dass Ihr String ~100 Zeichen lang sein wird, dann können Sie den StringBuilder auf diese Größe setzen und er wird intern nie erweitert werden müssen.0 Stimmen
Verwandte Dokumentation: stackoverflow.com/documentation/java/109/strings/5280/…
0 Stimmen
Es ist dasselbe intellij-support.jetbrains.com/hc/de/community/posts/…