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());
}
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:
À 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
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)
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.
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;}
}
.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.
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
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.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.