Eh bien, l'API pour en Integer.valueOf(String)
effet dit que le String
est interprété exactement comme s'il était donné à Integer.parseInt(String)
. Cependant, valueOf(String)
renvoie un objet alors que renvoie une primitivenew
Integer()
parseInt(String)
int
.
Si vous souhaitez profiter des avantages potentiels de la mise en cache Integer.valueOf(int)
, vous pouvez également utiliser cette horreur:
Integer k = Integer.valueOf(Integer.parseInt("123"))
Maintenant, si ce que vous voulez est l'objet et non la primitive, puis en utilisant valueOf(String)
peut - être plus attrayant que de faire un nouvel objet sur parseInt(String)
parce que le premier est toujours présent à travers Integer
, Long
, Double
, etc.
Integer.valueOf(Integer.parseInt("123"))
n'a aucun avantage surInteger.valueOf("123")
ou àInteger.valueOf(123)
part les cycles de gaspillage et la taille de votre programme.Integer.valueOf(String)
fait exactement la même mise en cache queInteger.valueOf(int)
. En fait, il est implémenté commeInteger.valueOf(Integer.parseInt(…))
…int
. La signature indique qu'elle renvoie unInteger
, et c'est exactement ce qu'elle fait. Cette réponse est également partiellement incorrecte lorsqu'elle indique qu'elle renvoie un «nouveau»Integer
. Ce n'est pas ce que dit le Javadoc. Il est libre de retourner un cacheInteger
.De ce forum :
la source
est similaire à
La différence est
valueOf()
renvoie unInteger
etparseInt()
retourne unint
(un type primitif). Notez également quevalueOf()
peut renvoyer uneInteger
instance mise en cache , ce qui peut entraîner des résultats confus lorsque le résultat des==
tests semble correct par intermittence. Avant l' autoboxing il pourrait y avoir une différence de commodité, après Java 1.5, cela n'a pas vraiment d'importance.De plus,
Integer.parseInt(s)
peut également prendre le type de données primitif.la source
Regardez les sources Java:
valueOf
utiliseparseInt
:parseInt
Retourint
la source
Integer.parseInt peut simplement retourner int comme type natif.
Integer.valueOf peut en fait avoir besoin d'allouer un objet Integer, sauf si cet entier se trouve être l'un des objets préalloués. Cela coûte plus cher.
Si vous avez juste besoin d'un type natif, utilisez parseInt. Si vous avez besoin d'un objet, utilisez valueOf.
De plus, en raison de cette allocation potentielle, la mise en boîte automatique n'est pas vraiment une bonne chose à tous points de vue. Cela peut ralentir les choses.
la source
Les variantes parse * renvoient des types primitifs et les versions valueOf renvoient des objets. Je crois que les versions valueOf utiliseront également un pool de référence interne pour renvoyer l'objet SAME pour une valeur donnée, pas seulement une autre instance avec la même valeur interne.
la source
Parce que vous utilisez peut-être jdk1.5 + et qu'il est automatiquement converti en int. Ainsi, dans votre code, il renvoie son premier Integer puis est automatiquement converti en int.
votre code est le même que
la source
Si vous cochez la classe Integer, vous trouverez cette valeur de la méthode call parseInt. La grande différence est la mise en cache lorsque vous appelez valueof API. Il cache si la valeur est comprise entre -128 et 127 Veuillez trouver ci-dessous le lien pour plus d'informations
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html
la source
public static Integer valueOf (String s)
Le résultat est un objet Integer qui représente la valeur entière spécifiée par la chaîne.
En d'autres termes, cette méthode renvoie un objet Integer égal à la valeur de: new Integer (Integer.parseInt (s))
la source
Integer.parseInt n'accepte que String et retourne le type entier primitif (int).
Iteger.valueOf accepte int et String. Si la valeur est String, valueOf la convertit en simple int à l'aide de parseInt et renvoie un nouvel entier si l'entrée est inférieure à -128 ou supérieure à 127. Si l'entrée est dans la plage (-128 - 127), elle renvoie toujours les objets Integer à partir d'un IntegerCache interne. La classe Integer maintient une classe IntegerCache statique interne qui agit comme cache et contient les objets entiers de -128 à 127 et c'est pourquoi lorsque nous essayons d'obtenir un objet entier pour 127 (par exemple), nous obtenons toujours le même objet.
Iteger.valueOf(200)
donnera un nouvel Integer à partir de 200. C'est commenew Integer(200)
Iteger.valueOf(127)
est le même queInteger = 127
;Si vous ne convertissez pas String en entier, utilisez-le
Iteger.valueOf
.Si vous ne voulez pas convertir String en simple int
Integer.parseInt
. Ça marche plus vite.Et en comparant Integer.valueOf (127) == Integer.valueOf (127) renvoie true
Parce qu'il prend les objets Integer avec les mêmes références du cache.
Mais Integer.valueOf (128) == Integer.valueOf (128) est faux, car 128 est hors de la plage IntegerCache et il renvoie un nouvel Integer, donc les objets auront des références différentes.
la source
Nous devons en utiliser un en fonction de nos besoins. En cas de ValueOf car il instancie un objet. cela consommera plus de ressources si nous n'avons besoin que de la valeur d'un texte, alors nous devrions utiliser parseInt, parseFloat etc.
la source