web-dev-qa-db-fra.com

différence entre equals () et hashCode ()

Je veux une brève définition de equals (), "==" et hashCode (). Si je lance le code suivant, cela signifie que la sortie sera "true false 2420395 2420395". Mais j'avais compris que la méthode equals () compare la chaîne et "==" compare la référence. Mais en sortie, la méthode hashCcode () affiche le numéro de référence des deux chaînes comme étant identique alors pourquoi "==" renvoie "false".

            String str = "Name";
    String str1 = new String("Name");

    if(str.equals(str1))
        System.out.println("true");
    else
        System.out.println("false");
    if(str==str1)
        System.out.println("true");
    else
        System.out.println("false");

    System.out.println(str.hashCode());
    System.out.println(str1.hashCode());
}
9
Dhivakar

Les méthodes equals () et hashCode () se révèlent très importantes lorsque des objets implémentant ces deux méthodes sont ajoutés à des collections. Si mis en œuvre de manière incorrecte, cela pourrait foirer votre vie.

equals () : Cette méthode vérifie si un autre objet qui lui est transmis en tant qu'argument est identique à l'objet dans lequel cette méthode est appelée. Il est facile de mal utiliser la méthode equals () si vous ne comprenez pas le contrat. Avant de remplacer cette méthode, il convient de garder à l’esprit les propriétés suivantes:

  • Réflexe: o1.equals (o1) - ce qui signifie qu'un objet (par exemple, o1) doit être égal à lui-même
  • Symétrique: o1.equals (o2) si et seulement o2.equals (o1) 
  • Transitive: o1.equals (o2) && o2.equals (o3) implique que o1.equals (o3) aussi
  • Consistant: o1.equals (o2) renvoie le même tant que o1 et o2 ne sont pas modifiés. 
  • comparaison null:! o1.equals (null) - ce qui signifie que tout objet instanciable n'est pas égal à null. Donc, si vous passez un null comme argument à votre objet o1, alors il devrait retourner false.
  • Valeur du code de hachage: o1.equals (o2) implique o1.hashCode () == o2.hashCode (). C'est très important. Si vous définissez une méthode equals (), vous devez également définir une méthode hashCode (). Cela signifie également que si vous avez deux objets égaux, ils doivent avoir le même hashCode, mais l'inverse n'est pas vrai.

À partir du code source Java

*
* @param   obj   the reference object with which to compare.
* @return  {@code true} if this object is the same as the obj
*          argument; {@code false} otherwise.
* @see     #hashCode()
* @see     Java.util.HashMap
*/
public boolean equals(Object obj) {
   return (this == obj);

}

hashCode () : Cette méthode retourne une valeur hashCode () sous la forme d'un entier et est prise en charge pour l'avantage des classes Java.util.Collection basées sur le hachage comme Hashtable, HashMap, HashSet, etc. méthode, elle doit également implémenter la méthode hashCode (). Avant de surcharger cette méthode, vous devez garder à l’esprit 

  • Chaque fois que la méthode hashCode () est appelée plusieurs fois sur le même objet lors de l'exécution d'un programme Java, cette méthode doit systématiquement renvoyer le même résultat. Le résultat entier ne doit pas rester cohérent d'une exécution du programme à la prochaine exécution du même programme.
  • Si deux objets sont égaux conformément à la méthode equals (), l'appel de la méthode hashCode () dans chacun des deux objets doit renvoyer le même résultat entier. Ainsi, si un champ n'est pas utilisé dans equals (), il ne doit pas être utilisé dans la méthode hashCode ().

  • Si deux objets ne sont pas égaux selon la méthode equals (), chacun des deux objets peut renvoyer deux résultats entiers différents ou des résultats entiers identiques (par exemple, si 2 objets ont le même résultat hashCode (), cela ne signifie pas qu'ils sont égaux, mais si deux objets sont égaux, ils doivent renvoyer le même résultat hashCode ().

Selon le code source Java Dans la mesure du possible, la méthode hashCode définie par Java.lang.Object renvoie des entiers distincts pour des objets distincts. (Ceci est généralement implémenté en convertissant l'adresse interne de l'objet en un entier)

14
dgm

hashCode() ne renvoie pas la référence de l'objet, mais un hachage de l'objet , calculé d'une manière ou d'une autre. == ne compare pas les objets en utilisant la valeur de hashCode() mais, comme vous dites correctement, par la valeur des références des objets.

6
Martin Dinov

Vous pouvez lire la documentation hashCode . En quelques mots, il est dit que si (obj1.equals(obj2) est true, alors obj1.hashCode()==obj2.hasCode() doit être true pour être un implémentation valide.

Notez que cela ne signifie pas que deux objets différents ne peuvent pas partager le même code de hachage. En réalité, cet exemple est une implémentation valide (mais terrible) de la méthode:

class MyClass {
    public int hashCode() {return 0;}
}
2
Pablo Lozano

.equals() compare le contenu réel de la chaîne. 

L'opérateur "==" compare si les deux objets ont la même référence en mémoire. Si vous deviez faire str = str1;, alors l'opérateur double égal renverrait true car il pointe vers la même référence en mémoire. 

hashCode() renvoie un hachage de l'objet de manière arbitraire. La valeur renvoyée sera toujours unique tant que la méthode n'est pas remplacée d'une manière ou d'une autre. Si .equals() renvoie true, le code de hachage doit être identique. 

1
ctzdev

equals () ne compare que string il ne vérifie pas la référence de string

mais '==' vérifier la référence et les données à la fois

dans le 1er cas, string str = "Nom"; un seul objet est créé mais dans

2ème cas Deux objets sont créés

String str1 = new String("Name");

alors les références ne sont pas identiques des deux chaînes, ce qui signifie qu'elles renvoient false

1
Amit Yadav
  1. Comme d'autres dit "==" compare les références. Mais les deux méthodes ne sont que des méthodes faisant quelque chose qui peut être remplacé.
  2. Chaque méthode fait quelque chose. Si vous voulez savoir ce qu’il fait exactement et ce qu’il signifie, vous devez lire la documentation.
  3. Vous pouvez remplacer ces méthodes comme vous le souhaitez. Notez cependant que vous devez suivre la documentation Java pour ces deux méthodes. Parce qu'ils sont utilisés par d'autres classes. Par exemple, equals() est utilisé pendant que vous essayez de trouver un objet dans une liste et .hashCode() est utilisé dans certaines classes de table de hachage fournies par la bibliothèque de classes Java.
0
Rad

equals () et hashCode () sont des méthodes différentes et la méthode hashCode ne doit pas être utilisée pour vérifier si deux références d'objet sont identiquesReason: hashCode renvoie simplement la valeur int d'un objet, même deux objets différents. peut avoir le même entier hashCode. La valeur renvoyée par hashCode () est le code de hachage de l'objet, qui correspond à l'adresse mémoire de l'objet en hexadécimale .equals () vérifie si les deux références d'objet sont identiques. Si deux objets sont égaux, leur hashCode doit être identique, mais l'inverse n'est pas vrai.

0
0coder