Comment l’opérateur == est-il implémenté en Java?

En particulier, dans le cas de l’égalité de référence d’object, que fait l’opérateur ==?

La comparaison renvoie-t-elle true si les références sont évaluées à la même adresse d’object au moment de la comparaison? Ou utilise-t-il la valeur hashCode des deux références pour déterminer si les objects sont identiques?

Pour être très spécifique ici, j’aimerais savoir quelles structures de données gérées par la machine virtuelle Java sont référencées par l’opération == pour la comparaison de références. Est-ce que == s’appuie sur la POO pour effectuer une comparaison de référence?

Malheureusement pour moi, le JLS ne définit pas comment l’opérateur == doit fonctionner . Les documents de l’API Java ne mentionnent pas ce que == est censé faire (ce sont des classes, n’est-ce pas?)

PS: Cette question sur l’ unicité des codes de hachage m’insortingguait un peu et je préférerais savoir comment la JVM de Sun (ou OpenJDK) implémente l’opérateur ==.

L’opérateur == ne fait que comparer les références.

Les références dans la machine virtuelle Java ne sont qu’un pointeur d’object standard. Cela correspond à une valeur entière unique 32 bits ou 64 bits (selon la plate-forme).

Lorsque vous comparez deux références d’object, vous ne comparez en réalité que deux entiers 32 bits ou 64 bits. S’ils sont identiques, vous serez égaux. Les valeurs entières sont un emplacement en mémoire.

Comme une référence n’est qu’un nombre, une comparaison de références se résume à une comparaison de deux nombres. Aucun hash n’est nécessaire.

L’opérateur == compare les références d’object pour voir si elles sont identiques, c’est-à-dire qu’elles se réfèrent au même object en mémoire.

La méthode equals() compare les références d’object pour voir si elles sont équivalentes, mais pas nécessairement identiques. L’implémentation par défaut d’ equals() utilise l’opérateur == , mais il est souvent logique de remplacer ce comportement. Par exemple, vous pouvez souhaiter que deux références BankAccount soient considérées comme équivalentes si elles portent le même numéro de compte, même s’il s’agit d’objects complètement différents.

L’opérateur == renvoie true si les objects sont le même object. Il n’y a pas d’access à hashCode () ou à equals () ici.

Essayez ceci pour confirmer:

 public class Test { static void testEqualEqual(Integer I0, Integer I1, boolean IsEquals) { if(!(IsEquals == (I0 == I1))) throw new AssertionError(); } static void testEqual(Integer I0, Integer I1, boolean IsEquals) { if(!(IsEquals == (I0.equals(I1)))) throw new AssertionError(); } static void testHash(Integer I0, Integer I1, boolean IsEquals) { if(!(IsEquals == (I0.hashCode() == I1.hashCode()))) throw new AssertionError(); } public static void main(Ssortingng ... args) { testEqualEqual( 1, 1, true); testEqualEqual(2000, 2000, false); testEqual( 1, 1, true); testEqual(2000, 2000, true); testHash( 1, 1, true); testHash(2000, 2000, true); System.out.println("Done"); } } 

Pour comprendre cela, vous devez d’abord savoir que le numéro 255 sera mis en cache lorsqu’il sera mis en cache. Cela signifie que Integer of 1 est toujours le même object mais Integer of 2000 sera toujours un object différent.

Cette expérience montre que ‘==’ renvoie true lorsque les objects sont identiques. Dans le cas ‘1’, ils sont identiques et retournent vrais. Mais dans le cas de la variable ‘2000’, les objects étant automatiquement différents, le résultat est false.

L’expérience montre également que ‘==’ n’utilise pas equals () ni hashCode ().

J’espère que cela t’aides.