Es ist erwähnenswert, dass wie von @ZhekaKozlov darauf hingewiesen wurde,
+
seit Java 9 schneller ist, es sei denn, der JVM weiß nicht, wie er es optimieren soll (z.B. Konkatenation in einer Schleife).
Ich habe den Bytecode für den folgenden Code überprüft (in Java 17):
public class StringBM {
public String toStringPlus(String a) {
return "{a:" + a + ", b:" + ", c: " + "}";
}
public String toStringBuilder(String a) {
StringBuilder sb = new StringBuilder(100);
return sb.append("{a:").append(a)
.append(", b:")
.append(", c:")
.append("}")
.toString();
}
}
Für toStringPlus
:
0: aload_1
1: invokedynamic #7, 0 // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String;
6: areturn
für toStringBuilder
:
0: new #11 // class java/lang/StringBuilder
3: dup
4: bipush 100
6: invokespecial #13 // Method java/lang/StringBuilder."":(I)V
9: astore_2
10: aload_2
11: ldc #16 // String {a:
13: invokevirtual #18 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: aload_1
17: invokevirtual #18 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: ldc #22 // String , b:
22: invokevirtual #18 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
25: ldc #24 // String , c:
27: invokevirtual #18 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
30: ldc #26 // String }
32: invokevirtual #18 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
35: invokevirtual #28 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
38: areturn
Die +
Version ruft einfach die dynamische Funktion makeConcatWithConstants
auf und übergibt das Methodenargument {a:\u0001, b:, c: } (\u0001
ist der Parameterplatzhalter).
Während die StringBuilder
Version es auf die 'ehrliche' Weise machen muss.
Ich denke, wir können jetzt sehen, warum +
schneller ist.
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/…