L' Integer
classe a une statique de cache, qui stocke 256 spécial Integer
objets: un pour chaque valeur comprise entre -128 et 127. Avec cela à l'esprit, considérez la différence entre ces trois.
new Integer(123);
C'est (évidemment) fait une nouvelle marque Integer
objet.
Integer.parseInt("123");
Il renvoie un int
valeur primitive après l'analyse de la String
.
Integer.valueOf("123");
C'est plus complexe que les autres. Il commence par l'analyse de la String
. Ensuite, si la valeur est comprise entre -128 et 127, il renvoie l'objet correspondant de la statique de cache. Si la valeur est en dehors de cette plage, alors il invoque new Integer()
et passe à la valeur, de sorte que vous obtenez un nouvel objet.
Maintenant, considérons les trois expressions de la question.
Integer.valueOf("127")==Integer.valueOf("127");
Elle renvoie true (vrai, parce que l' Integer
dont la valeur est de 127 est extrait deux fois à partir de la statique de cache, et par rapport à lui-même. Il n'y a qu'un Integer
objet impliqués, de sorte que cela renvoie true
.
Integer.valueOf("128")==Integer.valueOf("128");
Cela renvoie false
, en raison 128 n'est pas dans la statique de cache. Ainsi, un nouveau Integer
est créé pour chaque côté de l'égalité. Depuis, il existe deux sortes Integer
objets, et ==
pour les objets uniquement les retours true
si les deux côtés sont à l'exact même objet, cela va être false
.
Integer.parseInt("128")==Integer.valueOf("128");
C'est en comparant les primitives int
de la valeur de 128, sur la gauche, avec un nouveau Integer
objet sur la droite. Mais parce que ça n'a pas de sens de comparer un int
d'un Integer
, Java auto-unbox l' Integer
avant de faire la comparaison; donc, vous vous retrouvez à comparer une int
d'un int
. Depuis la primitive 128 est égal à lui-même, il renvoie true
.