[Java] Verwenden Sie nicht "+" im Anhang!

Dies ist eine Fortsetzung von Last Post.

Beim letzten Mal habe ich geschrieben, dass es besser ist, die Append-Methode von StringBuilder zu verwenden, wenn Sie eine String-Verkettung in Java durchführen.

Ich sehe jedoch gelegentlich Code, der Missbrauch anhängt.

Falscher Anwendungsfall des Anhängens

Zum Beispiel dieser Code

StringBuilder sb = new StringBuilder();
String val = "hoge";
sb.append("[" + val + "]")

String-Joins mit + verlangsamen den Prozess, da jedes Mal ein String-Objekt erstellt wird.

In diesem Beispiel wurde das String-Objekt im Teil "[" + val + "]" "erstellt, sodass sich die Verarbeitungsgeschwindigkeit möglicherweise verlangsamt.

Verbesserungsbeispiel

Lass uns das machen

StringBuilder sb = new StringBuilder();
String val = "hoge";
sb.append("[").append(val).append("]");

Anstatt "+" für die Verbindung zu verwenden, verwenden Sie "Anhängen" mehrmals, um eine Verbindung herzustellen.

Wie stark ändert sich die Verarbeitungsgeschwindigkeit vor und nach der Verbesserung?

Überprüfen Sie den Unterschied in der Verarbeitungsgeschwindigkeit

Ich habe die Verarbeitungsgeschwindigkeit mit dem folgenden Code verglichen.

public class StringBuilderTest{
  public static void main(String[] args) {
    final int MAX_COUNT = 100;
    System.out.println("Anzahl der Joins:" + MAX_COUNT + "Wann");

    StringBuilder sb1 = new StringBuilder();
    StringBuilder sb2 = new StringBuilder();

    long resultTime1;
    long resultTime2;
    long startTime;
    long endTime;

    /*********************Vor der Verbesserung: anhängen()Bei der Durchführung einer String-Kombination innerhalb*********************/
    //Startzeit
    startTime = System.nanoTime();

    for (int i = 0; i < MAX_COUNT; i++) {
      sb2.append(Integer.toString(i) + "\n");
    }
    //Endzeit
    endTime = System.nanoTime();

    //Berechnen Sie die für die Verarbeitung benötigte Zeit
    resultTime1 = endTime - startTime;

    /*********************Nach der Verbesserung: anhängen()Bei zweimaliger Verwendung*********************/
    //Startzeit
    startTime = System.nanoTime();

    //String Join von StringBuilder
    for (int i = 0; i < MAX_COUNT; i++) {
      sb1.append(Integer.toString(i)).append("\n");
    }
    //Endzeit
    endTime = System.nanoTime();

    //Zeit genommen
    resultTime2 = endTime - startTime;

    System.out.println("① append()Die Bearbeitungszeit beim Beitritt erfolgt innerhalb von:" + resultTime1 + "Nano Sekunden");
    System.out.println("② append()Verarbeitungszeit bei zweimaliger Verwendung:" + resultTime2 + "Nano Sekunden");
    System.out.println("② ist besser" + (resultTime1 - resultTime2) + "Nano Sekunden schneller");
  }
}

Es ist ein Programm, das den Unterschied in der Verarbeitungsgeschwindigkeit vergleicht, wenn die Zeichenkettenkombination 100 Mal ausgeführt wird.

Das Ergebnis ist unten.

スクリーンショット 2018-07-21 19.11.21.png

Es ist schneller, "Anhängen" zweimal zu verwenden.

schließlich

Eigentlich ist dieser Artikel ein Nachdruck aus dem Blog. Ich poste auch über andere Dinge in meinem Blog.

** Memorandum of SE-Kritzeleien des 1. Jahres - Hatena Blog **

Recommended Posts

[Java] Verwenden Sie nicht "+" im Anhang!
Verwenden Sie Stream in Java?
Deklarieren Sie keine Variablen in List in Java
Verwenden Sie OpenCV mit Java
Verwenden Sie PreparedStatement in Java
Schreiben Sie keinen Code, wenn (isAdmin == true) in Java
[Java] [Spring] [Spring Batch] Erstellen / verwenden Sie keine Spring Batch-Metadatentabelle
Führen Sie Scala's Option.or Null in Java aus
Mach HelloWorld mit Java / IntelliJ / Gradle
Verwenden wir Twilio in Java! (Einführung)
Verwenden Sie zusammengesetzte Schlüssel in Java Maps.
Wie verwende ich Klassen in Java?
Verwenden Sie OpenCV_Contrib (ArUco) mit Java! (Teil 2-Programmierung)
[Java] Verwenden Sie kryptografische Technologie mit Standardbibliotheken
Verwenden Sie "Rhino", das JavaScript in Java ausführt
Akzeptieren Sie System.in nicht im Gradle-Lauf
Kehren Sie nicht zurück, wenn Sie Notizen in Ruby machen
Führen Sie TensorFlow in Java aus. Es ist jedoch einfach. .. .. ..
Partisierung in Java
Änderungen in Java 11
Janken in Java
[Java] Verwenden Sie Collectors.collectingAndThen
Umfangsrate in Java
FizzBuzz in Java
Verwenden Sie OpenCV_Contrib (ArUco) mit Java! (Teil 1-Build) (OpenCV-3.4.4)
[Java] Verwendung von final in der lokalen Variablendeklaration
Lösung für NetBeans 8.2 funktioniert nicht in Java 9-Umgebung
Unterstützung für CheckStyle "Verwenden Sie keine Inline-Bedingungen"
[JAVA] [Spring] [MyBatis] Verwenden Sie IN () mit SQL Builder
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Machen Sie einen Blackjack mit Java
Janken App in Java
Machen Sie "Ich bin kein Roboter" in Java EE (Jakarta EE)
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
Ich möchte so etwas wie "cls" in Java machen
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Verwenden Sie java.time mit Jackson
Kommentare in der Java-Quelle
Ich möchte ES2015 auch in Java verwenden! → (´ ・ ω ・ `)
Azure funktioniert in Java
Formatieren Sie XML in Java
Einfache HTML-Spezialchars in Java
Boyer-Moore-Implementierung in Java
Verwenden Sie Interceptor im Frühjahr
Hallo Welt in Java
WebApi-Memorandum mit Java
Typbestimmung in Java
Adressiert, da Azure-Funktionen in Java nicht mehr funktionieren
Befehle in Java ausführen (Ping)
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
Zabbix API in Java
ASCII-Kunst in Java