[Java] N'utilisez pas "+" dans append!

Ceci est une suite de Dernier message.

La dernière fois, j'ai écrit qu'il est préférable d'utiliser la méthode append de StringBuilder lors de la concaténation de chaînes en Java.

Cependant, je vois parfois du code qui utilise mal l'ajout.

Mauvais cas d'utilisation d'ajout

Par exemple, ce code

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

Les jointures de chaîne utilisant «+» ralentiront le processus car elles créeront un objet String à chaque fois.

Dans cet exemple, l'objet String a été créé dans la partie " ["+ val +"] ", donc la vitesse de traitement finira par ralentir.

Exemple d'amélioration

Faisons cela

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

Au lieu d'utiliser «+» pour vous connecter, utilisez append plusieurs fois pour vous connecter.

Alors, dans quelle mesure la vitesse de traitement change-t-elle avant et après l'amélioration?

Vérifiez la différence de vitesse de traitement

J'ai comparé la vitesse de traitement avec le code ci-dessous.

public class StringBuilderTest{
  public static void main(String[] args) {
    final int MAX_COUNT = 100;
    System.out.println("Nombre de jointures:" + MAX_COUNT + "Quand");

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

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

    /*********************Avant amélioration: ajouter()Lors de l'exécution d'une combinaison de cordes dans*********************/
    //Heure de début
    startTime = System.nanoTime();

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

    //Calculez le temps de traitement
    resultTime1 = endTime - startTime;

    /*********************Après amélioration: ajouter()Lors de l'utilisation deux fois*********************/
    //Heure de début
    startTime = System.nanoTime();

    //Jointure de chaîne par StringBuilder
    for (int i = 0; i < MAX_COUNT; i++) {
      sb1.append(Integer.toString(i)).append("\n");
    }
    //heure de fin
    endTime = System.nanoTime();

    //Temps pris
    resultTime2 = endTime - startTime;

    System.out.println("① append()Temps de traitement lors de la combinaison dans:" + resultTime1 + "Nano secondes");
    System.out.println("② append()Temps de traitement lors de l'utilisation deux fois:" + resultTime2 + "Nano secondes");
    System.out.println("② c'est mieux" + (resultTime1 - resultTime2) + "Nano secondes plus rapide");
  }
}

C'est un programme qui compare la différence de vitesse de traitement lorsque la combinaison de chaînes de caractères est effectuée 100 fois.

Le résultat est ci-dessous.

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

Il est plus rapide d'utiliser ʻappend` deux fois.

à la fin

En fait, cet article est une réimpression du blog. Je publie également d'autres choses sur mon blog.

** Mémorandum des griffonnages SE de 1ère année - Blog Hatena **

Recommended Posts

[Java] N'utilisez pas "+" dans append!
Utilisez-vous Stream en Java?
Ne déclarez pas de variables dans List en Java
Utiliser OpenCV avec Java
Utiliser PreparedStatement en Java
N'écrivez pas de code si (isAdmin == true) en Java
[Java] [Spring] [Spring Batch] Ne pas créer / utiliser la table de métadonnées Spring Batch
Faites Option.ou Null de Scala en Java
Faites HelloWorld avec Java / IntelliJ / Gradle
Utilisons Twilio en Java! (Introduction)
Utilisez des clés composites dans Java Maps.
Comment utiliser les classes en Java?
Utilisez OpenCV_Contrib (ArUco) avec Java! (Partie 2-Programmation)
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
Utilisez "Rhino" qui exécute JavaScript en Java
N'acceptez pas System.in en cours de progression
Ne pas revenir lors de la prise de notes en Ruby
Faites TensorFlow en Java. C'est facile, cependant. .. .. ..
Partition en Java
Changements dans Java 11
Janken à Java
[Java] Utilisez Collectors.collectingAndThen
Taux circonférentiel à Java
FizzBuzz en Java
Utilisez OpenCV_Contrib (ArUco) avec Java! (Partie 1-Construire) (OpenCV-3.4.4)
[Java] Utilisation de final dans la déclaration de variable locale
La solution pour NetBeans 8.2 ne fonctionne pas dans l'environnement Java 9
Prise en charge de CheckStyle "Ne pas utiliser de conditions en ligne"
[JAVA] [Spring] [MyBatis] Utiliser IN () avec SQL Builder
Lire JSON en Java
Implémentation de l'interpréteur par Java
Faites un blackjack avec Java
Application Janken en Java
Créez "Je ne suis pas un robot" en Java EE (Jakarta EE)
Programmation par contraintes en Java
Mettez java8 dans centos7
Je veux faire quelque chose comme "cls" en Java
NVL-ish guy en Java
Joindre des tableaux en Java
"Hello World" en Java
Utilisez java.time avec Jackson
Commentaires dans la source Java
Je veux aussi utiliser ES2015 avec Java! → (´ ・ ω ・ `)
Fonctions Azure en Java
Formater XML en Java
Simple htmlspecialchars en Java
Implémentation Boyer-Moore en Java
Utilisez Interceptor au printemps
Hello World en Java
Mémorandum WebApi avec Java
Détermination de type en Java
Résolution du problème lorsque Azure Functions a cessé de fonctionner en Java
Exécuter des commandes en Java (ping)
Divers threads en java
Implémentation du tri de tas (en java)
API Zabbix en Java
Art ASCII à Java