Java int to String - Integer.toString (i) vs new Integer (i) .toString ()

428

Parfois, Java me laisse perplexe.
J'ai une énorme quantité d' initialisations int à faire.

Quelle est la vraie différence?

  1. Integer.toString(i)
  2. new Integer(i).toString()
marcolopes
la source
20
Je voudrais juste utiliser "" + 42, mais bon, c'est moi. Le formulaire n ° 2 se traduira par un nouvel objet entier (pour la plupart des valeurs de i) comme intermédiaire. C'est aussi plus de frappe.
16
@pst: si l'objet intermédiaire est un problème pour vous, ce "" + 42n'est pas mieux, car il nécessite un intermédiaire StringBuilderqui est beaucoup plus lourd qu'un an Integer.
Joachim Sauer
47
"" + 42 pourrait fonctionner, mais c'est une mauvaise idée. Des gens comme moi viendront regarder votre code et essayer de comprendre ce qui est arrivé à la chaîne vide.
Mainguy
3
Je ne recommanderais pas "" + 42car dans le cas de l'ajout de chaînes d'entiers, vous pourriez finir par ajouter des valeurs et ne pas le réaliser.
BoltzmannBrain
20
Si vous n'aimez pas beaucoup taper, vous ne devriez probablement pas programmer en Java.
Adam Pierce,

Réponses:

548

Integer.toStringappelle la méthode statique dans la classe Integer. Il n'a pas besoin d'une instance de Integer.

Si vous appelez, new 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 toStringméthode dessus pour lui demander de renvoyer une représentation sous forme de chaîne de lui - même .

Si tout ce que vous voulez est d'imprimer un int, vous utiliserez le premier car il est plus léger, plus rapide et n'utilise pas de mémoire supplémentaire (à part la chaîne retournée).

Si vous voulez un objet représentant une valeur entière - pour le mettre dans une collection par exemple - vous utiliseriez le second, car il vous donne un objet à part entière pour faire toutes sortes de choses que vous ne pouvez pas faire avec un nu int.

Jean
la source
96

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

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

oksayt
la source
43

Une autre option est la String.valueOfméthode statique .

String.valueOf(i)

Cela me semble un peu plus juste que Integer.toString(i)moi. Lorsque le type de i change, par exemple de intà double, le code restera correct.

fhucho
la source
2
Oui. Sauf si vous devez utiliser RADIX (dans ce cas, vous devez utiliser Integer.toString)
marcolopes
14
  1. new Integer(i).toString();

    Cette instruction crée l'objet de l'entier, puis appelle ses méthodes toString(i)pour renvoyer la représentation String de la valeur de l'entier .

  2. Integer.toString(i);

    Elle retourne l'objet String représentant l'int entier spécifique (entier) , mais voici toString(int)une staticméthode.

Le résumé est dans le premier cas, il renvoie la représentation de la chaîne des objets, alors que dans le second cas, il renvoie la représentation de la chaîne de l'entier.

Dhiraj
la source
13

Je recommande également fortement d'utiliser

int integer = 42;
String string = integer + "";

Simple et efficace.

Jasper Holton
la source
38
c'est certainement une mauvaise forme, car elle repose à la fois sur une partie assez subtile du langage Java et est moins efficace que Integer.toString (i). Voir ce message SO
rickcnagy
Cela pourrait être inefficace. Je suggère d'utiliser certains choix conventionnels comme Integer.toString ou String.valueOf. Vérifiez ici javadevnotes.com/java-integer-to-string-examples
JavaDev
C'est généralement une mauvaise idée de faire les choses de manière si peu intuitive. Des choix plus évidents comme Integer.toString()pourraient utiliser des touches supplémentaires, mais sont beaucoup plus clairs, ce qui est crucial lorsque vous souhaitez conserver le code.
Calvin Li
Cela n'appellerait-il pas automatiquement la toString()méthode de la variable entière ?
Ankit Deshpande du
11

Bien que j'aime la recommandation de fhucho

String.valueOf(i)

L'ironie est que cette méthode appelle en fait

Integer.toString(i)

Ainsi, utilisez-le String.valueOf(i)si vous aimez sa lecture et que vous n'avez pas besoin de radix, mais sachez également qu'il est moins efficace que Integer.toString(i).

Nathan Waite
la source
4

En termes de mesure de la performance, si vous envisagez la performance temporelle, alors Integer.toString (i); coûte cher si vous appelez moins de 100 millions de fois. Sinon, s'il s'agit de plus de 100 millions d'appels, le nouveau Integer (10) .toString () fonctionnera mieux.

Ci-dessous, 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 ();

prendra plus de mémoire car il créera l'objet à chaque fois, donc la fragmentation de la mémoire se produira.

Dhiraj
la source
2
J'ai collé ce code dans IntelliJ IDEA et j'ai reçu un avertissement: " new Integer(10).toString() can be simplified to Integer.toString(10)"
oksayt
Ce code fonctionne pour moi. J'obtiens environ 420 millisecondes pour Integer.toString (10) et 525 millisecondes pour le nouvel Integer (10) .toString ()
Jake Stevens-Haas
Aurait aidé à s'échauffer d'abord, sinon les résultats ne sont pas valides!
sixones
Si vous dites que l'un est cher dans un cas et que l'autre est meilleur dans l'autre cas, cela signifie que l'autre est meilleur / peu coûteux dans toutes les situations.
Sgene9
2

Meilleur:

Integer.valueOf(i).toString()
Ryu
la source
9
Pourquoi est-ce mieux?
Emile
1
Je pense que c'est mieux, car comme @Dhiraj a souligné qu'en termes de mémoire, le "nouveau Integer (i) .toString ();" prendra plus de mémoire car il crée un nouvel objet au lieu d'obtenir simplement la valeur entière et de la convertir en chaîne.
Patricia
4
@Lucy Integer.valueOf (i) renvoie un nouvel Integer, donc il n'y a aucune différence
inigoD
Vous ne répondez pas du tout à la question. La question est de savoir quelle est la différence entre bla et bla, pas quel est un meilleur remplacement pour bla.
ahitt6345
2

La manière simple est juste de concaténer ""avec un entier:

int i = 100;

String s = "" + i;

saura maintenant 100comme valeur de chaîne.

Shiv Buyya
la source
1

Ici, Integer.toStringla méthode statique est appelée dans la classe Integer. Il ne nécessite pas que l'objet appelle.

Si vous appelez, new Integer(i)vous créez d'abord une instance de type Integer, qui est un objet Java complet encapsulant la valeur de votre int i. Ensuite, vous appelez la toStringméthode dessus pour lui demander de renvoyer une représentation sous forme de chaîne de lui-même.

Shailej Shimpi
la source
0

1.Integer.toString(i)

Integer i = new Integer(8);
    // returns a string representation of the specified integer with radix 8
 String retval = i.toString(516, 8);
System.out.println("Value = " + retval);

2.new Integer(i).toString()

 int i = 506;

String str = new Integer(i).toString();
System.out.println(str + " : " + new Integer(i).toString().getClass());////506 : class java.lang.String
Shiva Nandam Sirmarigari
la source