class D {
public static void main(String args[]) {
Integer b2=128;
Integer b3=128;
System.out.println(b2==b3);
}
}
Production:
false
class D {
public static void main(String args[]) {
Integer b2=127;
Integer b3=127;
System.out.println(b2==b3);
}
}
Production:
true
Remarque: les nombres entre -128 et 127 sont vrais.
Réponses:
Lorsque vous compilez un littéral numérique en Java et que vous l'assignez à un entier (majuscule
I
), le compilateur émet:Cette ligne de code est également générée lorsque vous utilisez la boîte automatique.
valueOf
est implémenté de telle sorte que certains nombres soient "regroupés", et il renvoie la même instance pour les valeurs inférieures à 128.À partir du code source java 1.6, ligne 621:
La valeur de
high
peut être configurée sur une autre valeur, avec la propriété système.Si vous exécutez votre programme avec cette propriété système, il affichera true!
La conclusion évidente: ne vous fiez jamais à deux références identiques, comparez-les toujours à la
.equals()
méthode.Ainsi
b2.equals(b3)
affichera vrai pour toutes les valeurs logiquement égales de b2, b3.Notez que le
Integer
cache n'est pas là pour des raisons de performances, mais plutôt pour se conformer au JLS, section 5.1.7 ; l'identité d'objet doit être donnée pour les valeurs -128 à 127 inclus.Integer # valueOf (int) documente également ce comportement:
la source
false
. En fait, cela peut déjà se produire aujourd'hui, en tant qu'effet secondaire de l'application de l'analyse d'évasion et du remplacement scalaire.Autoboxing met en cache -128 à 127. Ceci est spécifié dans le JLS ( 5.1.7 ).
Une règle simple à retenir lorsque vous traitez avec des objets est - utilisez
.equals
si vous voulez vérifier si les deux objets sont "égaux", utilisez==
quand vous voulez voir s'ils pointent vers la même instance.la source
L'utilisation de types de données primitifs, ints, produirait vrai dans les deux cas, la sortie attendue.
Cependant, puisque vous utilisez des objets Integer, l'opérateur == a une signification différente.
Dans le contexte des objets, == vérifie si les variables font référence à la même référence d'objet.
Pour comparer la valeur des objets, vous devez utiliser la méthode equals () Eg
qui indiquera si b2 est inférieur à b1, supérieur ou égal à (consultez l'API pour plus de détails)
la source
C'est l'optimisation de la mémoire en Java.
la source
Jetez un œil à Integer.java, si la valeur est comprise entre -128 et 127, il utilisera le pool mis en cache, donc
(Integer) 1 == (Integer) 1
si(Integer) 222 != (Integer) 222
la source
D'autres réponses décrivent pourquoi les effets observés peuvent être observés, mais c'est vraiment hors de propos pour les programmeurs (intéressant, certes, mais quelque chose que vous devriez tout oublier lors de l'écriture de code réel).
Pour comparer les objets Integer pour l'égalité, utilisez la
equals
méthode.Ne pas essayer de comparer des objets entiers pour l' égalité en utilisant l'opérateur d'identité,
==
.Il peut arriver que certaines valeurs égales soient des objets identiques, mais ce n'est pas quelque chose sur lequel on devrait généralement se fier.
la source
J'ai écrit ce qui suit car ce problème n'est pas uniquement spécifique à Integer. Ma conclusion est que le plus souvent, si vous utilisez l'API de manière incorrecte, vous constaterez toujours un comportement incorrect. Utilisez-le correctement et vous devriez voir le bon comportement:
la source