493 votes

Différence entre parseInt() et valueOf() en java ?

Comment parseInt() différent de valueOf() ?

Ils semblent faire exactement la même chose pour moi (c'est également le cas de parseFloat() , parseDouble() , parseLong() etc., en quoi sont-ils différents de Long.valueOf(string) ?

En outre, lequel de ces éléments est préférable et utilisé le plus souvent par convention ?

462voto

Zach Scrivena Points 15052

Eh bien, l'API pour Integer.valueOf(String) dit en effet que le String est interprété exactement comme s'il était donné à Integer.parseInt(String) . Cependant, valueOf(String) renvoie un new Integer() alors que parseInt(String) renvoie une primitive int .

Si vous voulez profiter des avantages potentiels de la mise en cache de l'application Integer.valueOf(int) vous pourriez aussi utiliser cette horreur :

Integer k = Integer.valueOf(Integer.parseInt("123"))

Maintenant, si ce que vous voulez est l'objet et non la primitive, alors utiliser valueOf(String) peut être plus attrayant que de créer un nouvel objet à partir de parseInt(String) parce que le premier est systématiquement présent dans tous les Integer , Long , Double etc.

9 votes

Y a-t-il une différence de performance ou de mémoire entre les deux approches ?

97 votes

Integer.valueOf(Integer.parseInt("123")) n'a aucun avantage sur Integer.valueOf("123") ou Integer.valueOf(123) à part le gaspillage de cycles et la taille de votre programme.

12 votes

Il y a une différence - le nouvel objet (potentiellement) alloué par valueOf est accompagné d'une surcharge (mémoire pour l'objet, manipulation, GC), alors que le simple int est extrêmement "léger". (Pour les valeurs les plus courantes, vous obtiendrez des références à des Objects préexistants, ce qui aide un tout petit peu).

79voto

Michael Haren Points 42641

De ce forum :

parseInt() renvoie un entier primitif type ( int ), où valueOf renvoie à java.lang.Integer qui est l'objet représentatif de l'entier. Il existe circonstances où vous pouvez vouloir un objet Integer, au lieu d'un type primitif.

Bien sûr, une autre différence évidente est que intValue est une méthode d'instance par laquelle parseInt est une méthode statique.

12 votes

Il convient de mentionner que les versions valueOf utiliseront également un pool de références internes pour renvoyer le MEME objet pour une valeur donnée, et pas seulement une autre instance avec la même valeur interne. Cela signifie qu'avec deux Longs retournés de cette manière, a.equals(b) == true et a == b est vrai.

0 votes

Comme prouvé plus bas, vous avez raison pour les versions String, je pensais aux versions primitives. Long.valueOf(5) retournera toujours le même objet. Les versions String renvoient de nouveaux objets, les versions primitives renvoient les mêmes objets.

1 votes

@bassezero. De plus, ce pool a une limite. Je crois que c'était de -127 à 127.

42voto

Joao da Silva Points 3626
Integer.valueOf(s)

est similaire à

new Integer(Integer.parseInt(s))

La différence est valueOf() renvoie un Integer et parseInt() renvoie un int (un type primitif). Notez également que valueOf() peut retourner une Integer ce qui peut provoquer des résultats confus lorsque le résultat de == Les tests semblent corrects par intermittence. Avant autoboxing il pourrait y avoir une différence dans la commodité, après java 1.5 cela n'a plus vraiment d'importance.

De plus, Integer.parseInt(s) peut également prendre un type de données primitif.

4 votes

ValueOf() peut retourner le même objet lors d'appels successifs avec le même argument (et doit le faire pour les arguments compris entre -128 et 127 inclus). new Integer() créera toujours un nouvel objet.

0 votes

Lequel est le plus souvent utilisé ? Lequel dois-je utiliser le plus souvent ?

3 votes

Si vous avez besoin d'un int, utilisez parseInt(), si vous avez besoin d'un Integer, utilisez valueOf()

6voto

iny Points 3925

Integer.parseInt peut juste retourner int comme type natif.

Integer.valueOf peut en fait nécessiter l'allocation d'un objet Integer, à moins que cet entier ne soit l'un des objets préalloués. Cela coûte plus cher.

Si vous n'avez besoin que du type natif, utilisez parseInt. Si vous avez besoin d'un objet, utilisez valueOf.

De plus, à cause de cette répartition potentielle, la boîte automatique n'est pas vraiment une bonne chose à tous points de vue. Elle peut ralentir les choses.

0voto

MAR Points 11

Parce qu'il se peut que vous utilisiez la version 1.5+ de JDK et qu'il y ait une conversion automatique en int. Ainsi, dans votre code, il renvoie d'abord Integer puis se convertit automatiquement en int.

votre code est le même que

int abc = new Integer(123);

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