8
votes

Comportement incohérent sur Java's ==

Considérez ce code:

false
true
false


1 commentaires

Je crois que les retransts vous diront de votre erreur.


7 Réponses :


2
votes

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.


0 commentaires

7
votes

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

C'est ce que vous obtenez la plupart du temps, mais cela dépend de la mise en œuvre de la JVM.


2 commentaires

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.)



0
votes

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.

N'oubliez pas de ne jamais utiliser == sur des objets que vous ne savez jamais ce qui se passe.


1 commentaires

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 ());



15
votes

Autoboxing des primitives dans des objets (tels qu'utilisés dans vos appels vers Méthode code> utilise une mémoire cache de petites valeurs. À partir du Spécification de la langue Java Section 5.1.7 :

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>

Integer i1 = 129;
Integer i2 = 129;
boolean b = (i1 == i2);


4 commentaires

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.



0
votes

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: xxx

(code de Sun JDK 1.6) Ceci est comme une chaîne interne, puisqu'elle sauve la mémoire et permet à l'égalité des tests à l'aide d'une référence (par exemple, == à la place de égale


0 commentaires

1
votes

AutoBoxing utilise integer.valueof (i) , pas neuf entier (i), pour construire un objet d'entier de classe.

Comme les autres ont dit, la valeurOf () utilise une cache, principalement pour l'efficacité de l'espace.

N'utilisez pas == sur des types de référence, c'est presque toujours une erreur.


0 commentaires

0
votes

AutoBoxing Utilisez un mécanisme de mise en cache. Habituellement, vous ne devriez jamais s'appuyer sur == , toujours utiliser égale pour vérifier l'égalité.


0 commentaires