Dans cet article, je voudrais considérer, analyser, expliquer et montrer quelle est la différence entre la méthode append de la classe
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
StringBuilder
et l'opérateur +=
pour String
. Ici, la question ne portera pas tant sur les domaines d'application que sur l'optimisation du code.
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 String
n’est pas primitif. String
- un objet comme les autres class
en 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 append
plus 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.
GO TO FULL VERSION