La Integerclasse a un cache statique, qui stocke 256 Integerobjets 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 Integerobjet.
Integer.parseInt("123");
Cela renvoie une intvaleur 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 Integervaleur 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 Integerobjet 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 Integerest donc créé pour chaque côté de l'égalité. Puisqu'il y a deux Integerobjets différents , et ==pour les objets ne renvoie que truesi les deux côtés sont exactement le même objet, cela va être false.
Integer.parseInt("128")==Integer.valueOf("128");
Ceci compare la intvaleur primitive 128 sur la gauche, avec un Integerobjet nouvellement créé sur la droite. Mais comme cela n'a pas de sens de comparer un intà un Integer, Java déballera automatiquement le Integeravant 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.