La Integer
classe a un cache statique, qui stocke 256 Integer
objets spéciaux - un pour chaque valeur entre -128 et 127. Dans cet esprit, considérez la différence entre ces trois.
new Integer(123);
Cela fait (évidemment) un tout nouvel Integer
objet.
Integer.parseInt("123");
Cela renvoie une int
valeur primitive après l'analyse du String
.
Integer.valueOf("123");
C'est plus complexe que les autres. Il commence par analyser le fichier String
. Ensuite, si la valeur est comprise entre -128 et 127, il renvoie l'objet correspondant à partir du cache statique. Si la valeur est en dehors de cette plage, elle appellenew Integer()
et transmet la valeur, de sorte que vous obtenez un nouvel objet.
Maintenant, considérez les trois expressions de la question.
Integer.valueOf("127")==Integer.valueOf("127");
Cela renvoie true, car la Integer
valeur dont la valeur est 127 est extraite deux fois du cache statique et comparée à elle-même. Il n'y a qu'un seul Integer
objet impliqué, donc cela revient true
.
Integer.valueOf("128")==Integer.valueOf("128");
Cela revient false
, car 128 n'est pas dans le cache statique. Un nouveau Integer
est donc créé pour chaque côté de l'égalité. Puisqu'il y a deux Integer
objets différents , et ==
pour les objets ne renvoie que true
si les deux côtés sont exactement le même objet, cela va être false
.
Integer.parseInt("128")==Integer.valueOf("128");
Ceci compare la int
valeur primitive 128 sur la gauche, avec un Integer
objet nouvellement créé sur la droite. Mais comme cela n'a pas de sens de comparer un int
à un Integer
, Java déballera automatiquement le Integer
avant de faire la comparaison; vous finissez donc par comparer un int
à un int
. Puisque la primitive 128 est égale à elle-même, cela revient true
.
.equals()
, sinon tous les paris sont ouverts.