Différence entre parseInt et valueOf en java?
Quelle est la différence entre ces deux méthodes? Ils semblent faire exactement la même chose pour moi (va aussi pour parseFloat()
, parseDouble()
, parseLong()
etc, comment sont-ils différents des Long.valueOf(string)
?
Edit: Aussi, ce qui est préférable et plus souvent utilisé par convention?
Vous devez vous connecter pour publier un commentaire.
Bien, l'API pour
Integer.valueOf(String)
ne disent en effet que laString
est interprété exactement comme s'il était donné àInteger.parseInt(String)
. Cependant,valueOf(String)
renvoie unenew
Integer()
objet alors queparseInt(String)
renvoie une primitiveint
.Si vous voulez profiter du potentiel de la mise en cache des prestations de
Integer.valueOf(int)
, vous pouvez également utiliser cette horreur:Maintenant, si ce que vous voulez est l'objet et non pas le primitif, puis à l'aide
valueOf(String)
peut être plus intéressant que de faire un nouvel objet deparseInt(String)
parce que l'ancien est toujours présent à traversInteger
,Long
,Double
, etc.Integer.valueOf(Integer.parseInt("123"))
a aucun avantage surInteger.valueOf("123")
ouInteger.valueOf(123)
à part gaspiller des cycles et de la taille de votre programme.Integer.valueOf(String)
fait exactement la même mise en cache commeInteger.valueOf(int)
. En fait, il est mis en œuvre commeInteger.valueOf(Integer.parseInt(…))
...Integer.valueOf(123)
renvoie la primitive int. Les tests ont montré qu'entre[-127, 128]
il renvoie laprimitive not the object
, ce qui est exactement unesigned byte
.int
. La signature dit qu'elle renvoie unInteger
, et c'est exactement ce qu'il fait. Cette réponse est également partiellement incorrect lorsqu'elle dit qu'elle renvoie un "nouveau"Integer
. Ce n'est pas ce qu'il dit dans la Javadoc. Il est libre de retourner le cacheInteger
.valueOf(String)
renvoie unenew Integer()
objet" — Pas tout à fait. Au moins dans leInteger
implémentation de la classe en Java 8,Integer
s avec une valeur comprise entre -128 et 127 sont mis en cache.Integer.valueOf("42") == Integer.valueOf("42")
retournetrue
.De ce forum:
intValue
, pourquoi est-ce que votre réponse mentionneintValue
?est similaire à
La différence est
valueOf()
retourne unInteger
, etparseInt()
retourne unint
(un type primitif). Notez également quevalueOf()
pouvez revenir à une mise en cacheInteger
exemple, qui peut causer de la confusion où le résultat de==
tests semblent par intermittence correcte. Avant l'autoboxing il pourrait y avoir une différence dans le confort, après java 1.5, il n'a pas vraiment d'importance.En outre,
Integer.parseInt(s)
peut prendre des primitives de type de données ainsi.Regarder des sources Java:
valueOf
est à l'aide deparseInt
:parseInt
retourneint
Entier.parseInt pouvez simplement retourner int comme type natif.
Entier.valueOf peuvent avoir besoin d'allouer un objet Integer, à moins que entier se trouve être l'un des préaffectés ceux. Cela coûte de plus en plus.
Si vous avez besoin de tout type natif, utiliser parseInt. Si vous avez besoin d'un objet, utilisez valueOf.
Aussi, à cause de cette allocation, l'autoboxing n'est pas réellement une bonne chose dans tous les sens. Il peut ralentir les choses.
Parce que vous pourriez être en utilisant jdk1.5+ et là c'est de l'auto de conversion de int. Donc, dans votre code son premier retour Entier, puis auto converti en int.
votre code est le même que
L'analyse* les variations de retour de types primitifs et les valueOf versions de retour des Objets. Je crois que le valueOf versions également utiliser une référence interne de la piscine pour retourner le MÊME objet pour une valeur donnée, pas juste un autre exemple avec la même valeur.
Depuis valueOf renvoyer un nouvel objet Integer pourquoi le code ci-dessous est correct?
Si vous cochez la classe Integer, vous trouverez que valueof appel parseInt méthode. La grande différence, c'est la mise en cache lorsque vous appelez valueof API . Il cache si la valeur est comprise entre -128 à 127 Veuillez trouver ci-dessous le lien pour plus d'informations
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html
public static Entier valueOf(String s)
Le résultat est un Entier de l'objet qui représente la valeur de l'entier spécifié par la chaîne.
En d'autres termes, cette méthode retourne un objet Integer égale à la valeur de:
new Integer(nombre Entier).parseInt(s))
Entier.parseInt accepter uniquement les Cordes et revenir primitive de type entier (int).
Iteger.valueOf accepter int et String.
Si la valeur est une Chaîne, valueOf convertir le simple int utiliser parseInt et de retour de new Integer si l'entrée est inférieure à -128 ou supérieure à 127.
Si l'entrée est dans la plage (-128 à 127) il renvoie toujours l'Entier des objets à partir d'un interne IntegerCache. Classe Integer maintient un intérieur statique IntegerCache classe qui sert de cache et détient entier des objets de -128 à 127, et c'est pourquoi, lorsque nous essayons d'obtenir des objet integer pour 127 (par exemple), nous obtenons toujours le même objet.
Iteger.valueOf(200)
donnera un nouvel Entier à partir de 200. C'est commenew Integer(200)
Iteger.valueOf(127)
est le même queInteger = 127
;Si vous avez l'habitude de le convertir en Chaîne de caractères à l'Entier usage
Iteger.valueOf
.Si vous avez l'habitude de le convertir en Chaîne de caractères pour la simple int utilisation
Integer.parseInt
. Il travaille plus vite.Et en comparant Entier.valueOf(127) == Integer.valueOf(127) return true
Parce qu'il prend l'Entier des objets avec les mêmes références, à partir du cache.
Mais Entier.valueOf(128) == Integer.valueOf(128) est faux, parce que 128 est de IntegerCache gamme et qu'elle renvoie de nouveau Entier, de sorte que les objets ont des références différentes.
Nous devrions utiliser l'une en fonction de nos besoin. En cas de ValueOf que c'est l'instanciation d'un objet. il va consommer plus de ressources si nous avons seulement besoin de la valeur de texte, puis nous devrions utiliser parseInt,parseFloat etc.