JavaRush /Blog Java /Random-FR /String += String ou StringBuilder.append(String) ?
SemperAnte
Niveau 4
Донецк

String += String ou StringBuilder.append(String) ?

Publié dans le groupe Random-FR
Dans cet article, je voudrais considérer, analyser, expliquer et montrer quelle est la différence entre la méthode append de la classe StringBuilderet l'opérateur +=pour String. Ici, la question ne portera pas tant sur les domaines d'application que sur l'optimisation du code.
String += String ou StringBuilder.append(String) ?  - 1
Oui, une personne qui n'a sans doute pas approfondi cette question dira : "Pourquoi devrais-je remplacer l'opérateur += en créant un nouvel objet d'une classe complètement différente, puis appeler également la méthode toString()? Quel genre d'optimalité sommes-nous ? " "Tu parles ? Le choix est évident, de quoi parles-tu ?" et il aurait complètement tort. L’un des problèmes est qu’il Stringn’est pas primitif. String- un objet comme les autres classen Java, et comme vous le savez, en Java il n'y a pas de surcharge d'opérateurs (comme en C++, par exemple), les opérateurs sont définis uniquement pour les primitives, et pour aucune classe nous ne pouvons remplacer aucun opérateur. C'est pourquoi les opérateurs " +" et " += " sont une sorte de "béquille" de la bibliothèque Java, et une béquille entraîne toujours des pertes. En fait, arrêtons de tirer la queue du chat et passons aux mesures. Voici un programme simple qui mesure le temps nécessaire pour « coller » une ligne avec une variable de boucle 100 000 fois.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        String s = "Hello";
        for(int i = 0; i < 100000; ++i)
        {
            s+=i;
        }
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
Sur mon ordinateur, 6815 ms étaient affichés dans la console. Autrement dit, il a fallu près de 7 secondes à mon ordinateur pour assembler cette ligne. Remplaçons-le maintenant par StringBuilder et incluons même la méthode toString()dans les mesures.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        StringBuilder sb = new StringBuilder("Hello");
        for(int i = 0; i < 100000; ++i)
        {
            sb.append(i);
        }
        String s = sb.toString();
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
Mon PC m'a indiqué 10 ms. Autrement dit, 0,01 seconde. Je pense que la différence dans la pratique est assez évidente : en gros, cela a fonctionné 700 fois appendplus vite. Cela est dû au fait que " +" et " +=" peuvent eux-mêmes appeler le même append, mais en même temps avoir parcouru un long chemin à travers les béquilles du langage afin de comprendre qu'un tel opérateur existe même et ce qu'il devrait faire (le dernier paragraphe n'est rien de plus qu'une supposition, je ne suis pas un développeur JVM et je ne sais pas ce qu'il y a là et comment). C’est un exemple clair du fait qu’un objet supplémentaire n’est pas toujours coûteux. Oui, le code sera plus long de quelques lignes, mais le gain de temps dans les grands projets peut être colossal. Veuillez noter que les mesures n'ont pas été effectuées sur un PC de bureau doté d'un processeur préhistorique, mais imaginez maintenant quelle différence cela fera sur cet ordinateur de bureau même, qui peut difficilement tirer l'écharpe.
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION