"Wenn Sie Strings in Java verbinden, sollten Sie StringBuilder verwenden, anstatt den Operator + für String zu verwenden." "Leistungsänderungen sind nicht der Fall, wenn nur wenige Zeichenfolgenverknüpfungen vorhanden sind. Es ist jedoch besser, StringBuilder zu verwenden, wenn viele vorhanden sind." Das höre ich manchmal.
StringBuilder ist effizienter als alles andere, wenn Sie tatsächlich eine große Anzahl von String-Joins wiederholt ausführen, aber dort drüben und [hier](https :: //qiita.com/ota-meshi/items/40d5dcb0e99574a8a368#stringbuilder%E3%81%A8stringbuffer) hat das Überprüfungsergebnis bereits erhalten, daher werde ich es belassen.
Wenn Sie jedoch tatsächlich codieren, z. B. wenn Sie eine Zeichenfolge mit [Zeichenfolge] einschließen und anzeigen möchten, gibt es viele Fälle, in denen die Zeichenkettenkombination nur einige Male ausgeführt wird. In diesem Fall ist es sinnlos, eine neue Instanz von StringBuilder zu erstellen, eine Zeichenfolge einzufügen, die Zeichenfolgen nur einige Male zu kombinieren und sie dann an den Typ String zurückzugeben. ..
Wie oft sollten wir Strings kombinieren, bevor wir zu StringBuilder wechseln? Selbst wenn ich es gegoogelt habe, kam es nicht leicht heraus, also habe ich es selbst überprüft.
Die Messmethode ist
Bei Verwendung des Operators +: Deklarieren Sie eine Zeichenfolge → kombinieren Sie die entsprechenden Zeichenfolgen n-mal
PlusTest.java
public static void main(String[] args) {
for(int j = 0; j < LOOP; j++){
String str = "s";
plus(str, BUILD_NUM);
}
}
private static String plus(String str, int n) {
for (int i = 0; i < n; i++) {
str += "p";
}
return str;
}
Bei Verwendung von StringBuilder: Deklarieren Sie einen String → Erstellen Sie eine StringBuilder-Instanz → Kombinieren Sie die entsprechenden Strings n-mal
StringBuilderTest.java
public static void main(String[] args) {
for(int j = 0; j < LOOP; j++){
String str = "s";
sb(str, BUILD_NUM);
}
}
private static String sb(String str, int n) {
StringBuilder sb = new StringBuilder().append(str);
for (int i = 0; i < n; i++) {
sb.append("b");
}
return sb.toString();
}
Diese Reihe von Schritten wird 10 Millionen Mal wiederholt und die benötigte Zeit gemessen. Die Messung wird übrigens etwa 10 Mal wiederholt, um den Medianwert zu erhalten.
0 verbindet
Einmal
Zweimal
dreimal
Das Ergebnis war enttäuschend. Übrigens variierte die Messzeit von StringBuilder erheblich, und manchmal war 1 Mal kürzer als 0 Mal (gerade deklariert). Wenn die Anzahl der Kupplungen einige Male zunimmt, scheint sie nur innerhalb des Fehlerbereichs zu schwanken. In beiden Fällen ist es normalerweise schneller als mit dem Operator +.
Wenn ich versuche, Zeichenfolgen mit dem Operator + zu kombinieren, erstellt der Compiler anscheinend eine StringBuilder-Instanz und kombiniert sie (Referenz). "Bei Verwendung des Operators +: Zeichenfolge deklarieren-> entsprechende Zeichenfolgen n-mal kombinieren" ist also korrekt "Zeichenfolge deklarieren-> (StringBuilder-Instanz erstellen-> kombinieren) * n". Wird sein. Selbst wenn es nur einmal kombiniert wird, dauert es doppelt so lange wie das Messergebnis ... Machen Sie eine String-Instanz vergebens?
Wenn Sie nur einmal kombinieren möchten, erledigt der Compiler dies für Sie. Dies sollte auch so sein (es ist besser, den Operator + zu verwenden, da der Code unübersichtlich ist). Wenn Sie jedoch nervös sind, ist es besser, StringBuilder zu deklarieren und zu verwenden. Ich fühle mich wie. Wenn Sie mehr als einmal in einer Schleife drehen, ist es besser, StringBuilder zu verwenden, um unnötige StringBuilder-Deklarationen zu reduzieren.
[^ 1]: Es ist eine unzuverlässige Zahl, weil sie nur in 0 ms oder 16 ms ausgegeben wurde, aber ich ignoriere sie, weil ich nur die Zeit des Codes messe, der die for-Anweisung überhaupt erst verschwendet.
Recommended Posts