Considérez ce code:
false true false
7 Réponses :
C'est parce que la boxe fait des entiers sous une certaine valeur (128, je pense) se référer à un objet précontruit et des valeurs plus élevées aux nouveaux objets. P>
Lorsque l'autoboxage, les entiers entre -128 et 127 sont mis en cache et le même objet wrapper est renvoyé. La même chose avec des valeurs booléennes et des valeurs de caractère entre \ u0000 et \ u007f p>
C'est ce que vous obtenez la plupart du temps, mais cela dépend de la mise en œuvre de la JVM. P>
J'avais l'habitude de penser que c'était dépendant de JVM aussi, mais c'est en fait dans la spécification.
(Ou plutôt, il est spécifié pour ces valeurs, mais pas pour les autres.)
Je devinerais que l'emballage essaie de minimiser le nombre d'objets entier et ne crée qu'un seul objet représentant 2 TOO SAVE MEMORY. P>
N'oubliez pas de ne jamais utiliser == sur des objets que vous ne savez jamais ce qui se passe. p>
Oui, comme plusieurs ont dit, n'utilisez pas == Sauf que des effets spécifiques soient soutenus par "sait ce qui se passe" et d'utilisation générale: booléen booléen = booléen.valueof (i.IntValue () == Eye.Intvalue () ); System.out.println (boolean.tostring ());
Autoboxing des primitives dans des objets (tels qu'utilisés dans vos appels vers Si la valeur p étant en boîte est vraie,
faux, un octet, un caractère dans la gamme
\ u0000 à \ u007f, ou un int ou court
nombre entre -128 et 127, puis laisser
R1 et R2 sont les résultats de deux
conversions de boxe de p. C'est toujours
le cas que R1 == R2. P>
blockQuote> La partie de discussion de la spécification immédiatement suivante est intéressante aussi. Notamment un JVM peut cache plus em> les valeurs si elle veut - vous ne pouvez pas être sûr des résultats de faire: P> Méthode code> utilise une mémoire cache de petites valeurs. À partir du Spécification de la langue Java Section 5.1.7 :
Integer i1 = 129;
Integer i2 = 129;
boolean b = (i1 == i2);
C'est une logique sérieusement méchante - je suppose que c'est fait pour des raisons de performance?
Cela a-t-il vraiment un avantage? Je pense que c'est une décision de conception obscope.
6U14 (et diverses variantes précédentes) a une option pour augmenter la gamme interne. C'est important pour certains points de repère et styles de programmation.
La morale de l'histoire devrait être lorsque la comparaison d'objets est égale () est toujours la bonne chose à faire, même pour des emballages pour des types primitifs.
La classe entier contient une cache de certaines instances fréquemment utilisées. La gamme de valeurs varie généralement de JVM à JVM (parfois est également configurable), mais en général, le code pertinent est quelque chose comme: (code de Sun JDK 1.6) p>
AutoBoxing utilise Comme les autres ont dit, la valeurOf () utilise une cache, principalement pour l'efficacité de l'espace. P>
N'utilisez pas == sur des types de référence, c'est presque toujours une erreur. P>
AutoBoxing Utilisez un mécanisme de mise en cache. Habituellement, vous ne devriez jamais s'appuyer sur == code>, toujours utiliser
égale code> pour vérifier l'égalité. p>
Je crois que les retransts vous diront de votre erreur.