435 votes

Java int to String - Integer.toString(i) vs 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 ?

  1. Integer.toString(i)
  2. new Integer(i).toString()

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 un StringBuilder intermédiaire qui est beaucoup plus lourd qu'un Integer.

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.

557voto

Jean Points 4881

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.

96voto

oksayt Points 2548

new Integer(i).toString() crée d'abord un objet d'enrobage (redondant) autour de i (qui peut lui-même être un objet d'enrobage Integer).

Integer.toString(i) est préféré car il ne crée aucun objet inutile.

14voto

Dhiraj Points 256
  1. 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.

  2. 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.

13voto

Jasper Holton Points 270

Je recommande également vivement d'utiliser

int entier = 42;
String chaine = entier + "";

Simple et efficace.

38 votes

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

0 votes

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

0 votes

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.

4voto

Dhiraj Points 256

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.

2 votes

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)"

0 votes

Ce code fonctionne pour moi. Je reçois environ 420 millisecondes pour Integer.toString(10) et 525 millisecondes pour new Integer(10).toString()

1 votes

Prograide.com

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.

Powered by:

X