50 votes

Pourquoi '<', '>' fonctionne-t-il avec les classes wrapper alors que '==' ne le fait pas?

Je sais que '==' ne fonctionne pas avec les valeurs situées en dehors de la plage [-128,127], car un cache est conservé pour les objets Integer dans cette plage et la même référence est renvoyée si la valeur est dans la plage. Mais pourquoi ">", "<", "> =", "<=" donnent-ils des réponses correctes même en dehors de la plage?

 Integer a=150;
Integer b=150;
System.out.println(a==b); //returns false

Integer a=150;
Integer b=150;
System.out.println(a>=b); // returns true
 

Pourquoi cela arrive-t-il ?

83voto

Eran Points 35360

L' <, >, <= et >= des opérateurs sont définies uniquement pour les types primitifs. Donc sur les types wrapper, le compilateur unbox les objets primitifs.

Cela signifie

System.out.println(a>=b);

est équivalent à

System.out.println(a.intValue()>=b.intValue());

Cependant, l' == et != opérateurs existent pour les types primitifs et les types référence, afin de les utiliser pour comparer deux objets de primitif types compare les références à la place des valeurs primitives qu'elles enveloppent.

Comme Holger commenté, la comparaison des références d'objet avec == et != existé dans la langue de Java avant de l'auto-boxing et de l'auto-unboxing ont été introduites, mais la comparaison avec d' <, >, <= et >= n'a pas été pris en charge pour tous les types de référence avant d'auto-unboxing a été introduit.

Cela signifie que, dans les premiers jours de Java, l' a>=b de votre extrait de code ne serait pas passer la compilation (depuis a et b ne sont pas primitives types numériques). D'autre part, votre a==b extrait serait encore passer à la compilation et de revenir false.

Modification du comportement d' == et != pour les types de référence qui se trouvent être des wrappers de numérique primitives serait de modifier le comportement de code existant, brisant ainsi une compatibilité ascendante, ce qui est probablement la raison pour laquelle il n'a pas été fait.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X