Parfois, Java me pose des problèmes.
J'ai une énorme quantité d'initialisations d'int à faire.
Quelle est la différence réelle ?
Integer.toString(i)
new Integer(i).toString()
Parfois, Java me pose des problèmes.
J'ai une énorme quantité d'initialisations d'int à faire.
Quelle est la différence réelle ?
Integer.toString(i)
new Integer(i).toString()
Integer.toString
appelle la méthode statique de la classe Integer
. Elle n'a pas besoin d'une instance de Integer
.
Si vous appelez nouveau Integer(i)
vous créez une instance de type Integer
, qui est un objet Java complet encapsulant la valeur de votre int. Ensuite, vous appelez la méthode toString
dessus pour lui demander de renvoyer une représentation en chaîne de caractères de l'objet lui-même.
Si tout ce que vous voulez c'est afficher un int
, vous utiliseriez le premier car il est plus léger, plus rapide et n'utilise pas de mémoire supplémentaire (à part la chaîne renvoyée).
Si vous voulez un objet représentant une valeur entière - pour le mettre dans une collection par exemple - vous utiliseriez le deuxième, car il vous donne un objet complet pour faire toutes sortes de choses que vous ne pouvez pas faire avec un simple int
.
new Integer(i).toString();
Cette instruction crée l'objet de type Integer et appelle ensuite sa méthode toString(i)
pour retourner la représentation sous forme de chaîne de caractères de la valeur de l'entier.
Integer.toString(i);
Il retourne l'objet String représentant l'entier spécifique, mais ici toString(int)
est une méthode static
.
En résumé, dans le premier cas, cela renvoie la représentation sous forme de chaîne d'objets, tandis que dans le deuxième cas, cela renvoie la représentation sous forme de chaîne de caractères de l'entier.
Ceci est définitivement une mauvaise forme, car cela repose à la fois sur une partie assez subtile du langage Java et est moins efficace que Integer.toString(i). Voir cette publication SO
Cela pourrait être inefficace. Je suggère d'utiliser des choix conventionnels comme Integer.toString ou String.valueOf. Vérifiez ici javadevnotes.com/java-integer-to-string-examples
Il est généralement une mauvaise idée de faire les choses d'une manière aussi non intuitive. Des choix plus évidents comme Integer.toString()
peuvent nécessiter quelques frappes supplémentaires, mais ils sont beaucoup plus clairs, ce qui est crucial lorsque vous voulez maintenir le code.
En termes de mesure de performance, si vous considérez la performance en termes de temps alors Integer.toString(i); est coûteux si vous l'appelez moins de 100 millions de fois. Si vous l'appelez plus de 100 millions de fois, alors new Integer(10).toString() sera plus performant.
Voici le code à travers lequel vous pouvez essayer de mesurer les performances,
public static void main(String args[]) {
int MAX_ITERATION = 10000000;
long starttime = System.currentTimeMillis();
for (int i = 0; i < MAX_ITERATION; ++i) {
String s = Integer.toString(10);
}
long endtime = System.currentTimeMillis();
System.out.println("diff1: " + (endtime-starttime));
starttime = System.currentTimeMillis();
for (int i = 0; i < MAX_ITERATION; ++i) {
String s1 = new Integer(10).toString();
}
endtime = System.currentTimeMillis();
System.out.println("diff2: " + (endtime-starttime));
}
En termes de mémoire, le
new Integer(i).toString();
va prendre plus de mémoire car il créera l'objet à chaque fois, entraînant ainsi une fragmentation de la mémoire.
J'ai collé ce code dans IntelliJ IDEA et j'ai eu un avertissement: "new Integer(10).toString() peut être simplifié en Integer.toString(10)
"
Ce code fonctionne pour moi. Je reçois environ 420 millisecondes pour Integer.toString(10) et 525 millisecondes pour new Integer(10).toString()
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
20 votes
Je vais tout simplement utiliser
"" + 42
, mais bon, c'est moi. La Forme #2 résultera en un nouvel objet entier (pour la plupart des valeurs de i) en tant qu'intermédiaire. C'est aussi plus de frappe.16 votes
@pst: si l'objet intermédiaire vous pose problème, alors
"" + 42
n'est pas mieux, car cela nécessite unStringBuilder
intermédiaire qui est beaucoup plus lourd qu'unInteger
.47 votes
"" + 42 pourrait fonctionner, mais c'est une mauvaise idée. Les gens comme moi viendront voir votre code et essayer de comprendre ce qui s'est passé avec la chaîne vide.
3 votes
Je ne recommanderais pas
"" + 42
car dans le cas de l'ajout de chaînes de nombres entiers, vous pourriez finir par ajouter les valeurs sans vous en rendre compte.0 votes
@alavin89, nous parlons de Java ici, cela n'arrivera certainement pas. Un avertissement valable dans le cas de JS et de langages similaires cependant.
21 votes
Si vous n'aimez pas taper beaucoup, alors vous ne devriez probablement pas programmer en Java.
2 votes
Je préfère personnellement
String.valueOf()
car il peut être utilisé pour n'importe quel type.1 votes
Que diriez-vous d'utiliser une chaîne formatée : String.format("%d", i);