fonctionnement de l’opérateur égal avec les données de type primitif et d’object

Je sais que c’est une question très fondamentale, mais je veux être clair sur le concept. Je veux savoir comment l’opérateur == fonctionne en cas de type primitif et d’object. Par exemple

 Integer a = 1; int b = 1; System.out.println(a == b) 

comment a est comparé à b , alors que a contient le ref d’un object qui contient la valeur 1. Est-ce que quelqu’un peut me le dire comment il fonctionne en interne?

En général, l’opérateur d’égalité en Java effectue une comparaison dite superficielle. En d’autres termes, il compare les valeurs contenues dans les variables. Désormais, les variables des types de données primitifs contiennent la valeur elle-même, tandis que les types de référence contiennent une référence à la zone de tas qui stocke le contenu réel. Cela signifie que dans votre extrait de code, int b conservera la valeur 1 et Integer a conservera l’adresse mémoire de l’object Integer réel sur le tas.

Maintenant, dans l’exemple fourni par vous, il y a une particularité. Classe entière Une classe wrapper spéciale qui encapsule les types entiers primitifs. Le compilateur peut automatiquement convertir entre ces objects wrapper et les types primitifs (appelés boxing et unboxing).

Voyons le code étape par étape pour que tout soit clair.

 Integer a = 1; 

Le compilateur substitue en fait le code suivant installé de cette ligne:

 Integer a = Integer.valueOf(1); 

La méthode statique valueOf renvoie une instance d’object wrapper qui encapsule la valeur primitive fournie. Cette procédure lorsque le compilateur construit une classe wrapper à partir d’un type primitif est appelée boxing.

Lors de l’utilisation d’un tel object wrapper, une comparaison avec une variable primitive à l’aide de l’opérateur d’égalité

 a == b 

le compilateur le modifie comme suit:

 a.intValue() == b; 

intValue renvoie la valeur primitive enveloppée par l’object wrapper (appelé unboxing), c’est-à-dire qu’il déballe la valeur primitive et rend l’expression équivalente à la comparaison de deux primitives. C’est pourquoi l’opérateur d’égalité renvoie alors true

Dans votre exemple particulier, le type boxed Integer sera décompressé en un type primitif int et == comparera les primitives (c’est-à-dire true dans votre cas).